深度学习 深度学习、神经网络、机器学习、人工智能的关系 深度学习、机器学习、人工智能
简单来说:
深度学习是机器学习的一个分支(最重要的分支)
机器学习是人工智能的一个分支
深度学习、神经网络
深度学习的概念源于人工神经网络的研究,但是并不完全等于传统神经网络。
不过在叫法上,很多深度学习算法中都会包含”神经网络”这个词,比如:卷积神经网络、循环神经网络。
所以,深度学习可以说是在传统神经网络基础上的升级,约等于神经网络。
案例:别图片中的汉字 假设深度学习要处理的信息是“水流”,而处理数据的深度学习网络是一个由管道和阀门组成的巨大水管网络。网络的入口是若干管道开口,网络的出口也是若干管道开口。这个水管网络有许多层,每一层由许多个可以控制水流流向与流量的调节阀。根据不同任务的需要,水管网络的层数、每层的调节阀数量可以有不同的变化组合。对复杂任务来说,调节阀的总数可以成千上万甚至更多。水管网络中,每一层的每个调节阀都通过水管与下一层的所有调节阀连接起来,组成一个从前到后,逐层完全连通的水流系统。
图片转化为计算机能看懂的语言 那么,计算机该如何使用这个庞大的水管网络来学习识字呢?
比如,当计算机看到一张写有“田”字的图片,就简单将组成这张图片的所有数字(在计算机里,图片的每个颜色点都是用“0”和“1”组成的数字来表示的)全都变成信息的水流,从入口灌进水管网络。
识别“田”字
我们预先在水管网络的每个出口都插一块字牌,对应于每一个我们想让计算机认识的汉字。这时,因为输入的是“田”这个汉字,等水流流过整个水管网络,计算机就会跑到管道出口位置去看一看,是不是标记由“田”字的管道出口流出来的水流最多。如果是这样,就说明这个管道网络符合要求。如果不是这样,就调节水管网络里的每一个流量调节阀,让“田”字出口“流出”的水最多。
这下,计算机要忙一阵了,要调节那么多阀门!好在计算机的速度快,暴力的计算加上算法的优化,总是可以很快给出一个解决方案,调好所有阀门,让出口处的流量符合要求。
识别“申”字 下一步,学习“申”字时,我们就用类似的方法,把每一张写有“申”字的图片变成一大堆数字组成的水流,灌进水管网络,看一看,是不是写有“申”字的那个管道出口流水最多,如果不是,我们还得再调整所有的阀门。这一次,要既保证刚才学过的“田”字不受影响,也要保证新的“申”字可以被正确处理。
如此反复进行,知道所有汉字对应的水流都可以按照期望的方式流过整个水管网络。这时,我们就说,这个水管网络是一个训练好的深度学习模型了。当大量汉字被这个管道网络处理,所有阀门都调节到位后,整套水管网络就可以用来识别汉字了。这时,我们可以把调节好的所有阀门都“焊死”,静候新的水流到来。
一行字里面识别“田”和”申“
与训练时做的事情类似,未知的图片会被计算机转变成数据的水流,灌入训练好的水管网络。这时,计算机只要观察一下,哪个出水口流出来的水流最多,这张图片写的就是哪个字。
深度学习大致就是这么一个用人类的数学知识与计算机算法构建起来的整体架构,再结合尽可能多的训练数据以及计算机的大规模运算能力去调节内部参数,尽可能逼近问题目标的半理论、半经验的建模方式。
传统机器学习 VS 深度学习 传统机器学习和深度学习的相似点
在数据准备和预处理方面,两者是很相似的。
他们都可能对数据进行一些操作:
传统机器学习和深度学习的核心区别
传统机器学习的特征提取主要依赖人工,针对特定简单任务的时候人工提取特征会简单有效,但是并不能通用。
深度学习的特征提取并不依靠人工,而是机器自动提取的。这也是为什么大家都说深度学习的可解释性很差,因为有时候深度学习虽然能有好的表现,但是我们并不知道他的原理是什么。
深度学习的优缺点
优点
学习能力强 从结果来看,深度学习的表现非常好,他的学习能力非常强。
覆盖范围广,适应性好 深度学习的神经网络层数很多,宽度很广,理论上可以映射到任意函数,所以能解决很复杂的问题。
数据驱动,上限高 深度学习高度依赖数据,数据量越大,他的表现就越好。在图像识别、面部识别、NLP 等部分任务甚至已经超过了人类的表现。同时还可以通过调参进一步提高他的上限。
可移植性好 由于深度学习的优异表现,有很多框架可以使用,例如 TensorFlow、Pytorch。这些框架可以兼容很多平台。
缺点
计算量大,便携性差 深度学习需要大量的数据很大量的算力,所以成本很高。并且现在很多应用还不适合在移动设备上使用。目前已经有很多公司和团队在研发针对便携设备的芯片。这个问题未来会得到解决。
硬件需求高 深度学习对算力要求很高,普通的 CPU 已经无法满足深度学习的要求。主流的算力都是使用 GPU 和 TPU,所以对于硬件的要求很高,成本也很高。
模型设计复杂 深度学习的模型设计非常复杂,需要投入大量的人力物力和时间来开发新的算法和模型。大部分人只能使用现成的模型。
没有”人性”,容易存在偏见 由于深度学习依赖数据,并且可解释性不高。在训练数据不平衡的情况下会出现性别歧视、种族歧视等问题。
几个典型的深度学习算法
卷积神经网络 CNN CNN 的价值:
能够将大数据量的图片有效的降维成小数据量(并不影响结果)
能够保留图片的特征,类似人类的视觉原理
CNN 的基本原理:
卷积层 – 主要作用是保留图片的特征
池化层 – 主要作用是把数据降维,可以有效的避免过拟合
全连接层 – 根据不同任务输出我们想要的结果
CNN 的实际应用:
图片分类、检索
目标定位检测
目标分割
人脸识别
骨骼识别
循环神经网络 – RNN RNN 是一种能有效的处理序列数据的算法。比如:文章内容、语音音频、股票价格走势…
之所以他能处理序列数据,是因为在序列中前面的输入也会影响到后面的输出,相当于有了“记忆功能”。但是 RNN 存在严重的短期记忆问题,长期的数据影响很小(哪怕他是重要的信息)。
于是基于 RNN 出现了 LSTM 和 GRU 等变种算法。这些变种算法主要有几个特点:
长期信息可以有效的保留
挑选重要信息保留,不重要的信息会选择“遗忘”
RNN 几个典型的应用如下:
文本生成
语音识别
机器翻译
生成图像描述
视频标记
生成对抗网络 – GANs
假设一个城市治安混乱,很快,这个城市里就会出现无数的小偷。在这些小偷中,有的可能是盗窃高手,有的可能毫无技术可言。假如这个城市开始整饬其治安,突然开展一场打击犯罪的「运动」,警察们开始恢复城市中的巡逻,很快,一批「学艺不精」的小偷就被捉住了。之所以捉住的是那些没有技术含量的小偷,是因为警察们的技术也不行了,在捉住一批低端小偷后,城市的治安水平变得怎样倒还不好说,但很明显,城市里小偷们的平均水平已经大大提高了。
警察们开始继续训练自己的破案技术,开始抓住那些越来越狡猾的小偷。随着这些职业惯犯们的落网,警察们也练就了特别的本事,他们能很快能从一群人中发现可疑人员,于是上前盘查,并最终逮捕嫌犯;小偷们的日子也不好过了,因为警察们的水平大大提高,如果还想以前那样表现得鬼鬼祟祟,那么很快就会被警察捉住。为了避免被捕,小偷们努力表现得不那么「可疑」,而魔高一尺、道高一丈,警察也在不断提高自己的水平,争取将小偷和无辜的普通群众区分开。随着警察和小偷之间的这种「交流」与「切磋」,小偷们都变得非常谨慎,他们有着极高的偷窃技巧,表现得跟普通群众一模一样,而警察们都练就了「火眼金睛」,一旦发现可疑人员,就能马上发现并及时控制——最终,我们同时得到了最强的小偷和最强的警察。
深度强化学习 – RL 强化学习算法的思路非常简单,以游戏为例,如果在游戏中采取某种策略可以取得较高的得分,那么就进一步「强化」这种策略,以期继续取得较好的结果。这种策略与日常生活中的各种「绩效奖励」非常类似。我们平时也常常用这样的策略来提高自己的游戏水平。
总结 深度学习属于机器学习的范畴,深度学习可以说是在传统神经网络基础上的升级,约等于神经网络。
深度学习和传统机器学习在数据预处理上都是类似的。核心差别在特征提取环节,深度学习由机器自己完成特征提取,不需要人工提取。
深度学习的优点:
学习能力强
覆盖范围广,适应性好
数据驱动,上限高
可移植性好
深度学习的缺点:
计算量大,便携性差
硬件需求高
模型设计复杂
没有”人性”,容易存在偏见
在 Flappy bird 这个游戏中,我们需要简单的点击操作来控制小鸟,躲过各种水管,飞的越远越好,因为飞的越远就能获得更高的积分奖励。
这就是一个典型的强化学习场景:
机器有一个明确的小鸟角色——代理
需要控制小鸟飞的更远——目标
整个游戏过程中需要躲避各种水管——环境
躲避水管的方法是让小鸟用力飞一下——行动
飞的越远,就会获得越多的积分——奖励
深度学习流程 1. 定义问题 确定是分类问题还是回归问题,还是无监督问题。
2. 探索和清洗数据 探索和进一步清洗数据集一直都是深度学习中最重要的一步。
3. 选择模型并探索模型结果 探索模型的结果,通常是需要对模型在验证集上的性能进行进一步的分析,这是如何进一步提升模型性能很重要的步骤。将模型在训练集和验证集都进行结果的验证和可视化,可直观的分析出模型是否存在较大偏差以及结果的正确性。
4. 监控训练和验证误差 首先很多情况下,我们忽略代码的规范性和算法 撰写正确性验证,这点上容易产生致命的影响。
在训练和验证都存在问题时,首先请确认自己的代码是否正确 。其次,根据训练和验证误差进一步追踪模型的拟合状态 。若训练数据集很小,此时监控误差则显得格外重要。确定了模型的拟合状态对进一步调整学习率的策略的选择或者其他有效超参数的选择则会更得心应手。
模型提升策略 1. 数据角度 数据增强。 扩充数据集。
2. 模型角度 提高模型复杂度,更改模型结构。
3. 调参角度 4. 训练角度 深度学习脑图 flowchart LR
A[深度学习]
A --> B[Tirck]
A --> C[卷积神经网络(CNN)]
A --> D[循环神经网络(RNN)]
A --> E[人工神经网络(ANN)]
Trick Dropout
简单来说,Dropout 通过参数共享 提供了一种廉价的 Bagging 集成近似—— Dropout 策略相当于集成了包括所有从基础网络除去部分单元后形成的子网络。
QA 1. 为何 Dropout 能够解决过拟合?
取平均的作用: 先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。
dropout 掉不同的隐藏神经元就类似在训练不同的网络(随机删掉一半隐藏神经元导致网络结构已经不同),整个dropout过程就相当于 对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。(这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况)。 迫使网络去学习更加鲁棒的特征 (这些特征在其它的神经元的随机子集中也存在)。
换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式(鲁棒性)。(这个角度看 dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高)
2. Drpout 与 Bagging 有何不同?
在 Bagging 的情况下,所有模型都是独立的;而在 Dropout 的情况下,所有模型共享参数 ,其中每个模型继承父神经网络参数的不同子集。
在 Bagging 的情况下,每一个模型都会在其相应训练集上训练到收敛。而在 Dropout 的情况下,通常大部分模型都没有显式地被训练;取而代之的是,在单个步骤中我们训练一小部分的子网络,参数共享会使得剩余的子网络也能有好的参数设定。
3. Dropout 有什么缺陷? dropout一大缺点就是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。定义明确的代价函数J每次迭代后都会下降,因为我们所优化的代价函数J实际上并没有明确定义,或者说在某种程度上很难计算,所以我们失去了调试工具来绘制这样的图片。
我通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug。我觉得你也可以尝试其它方法,虽然我们并没有关于这些方法性能的数据统计,但你可以把它们与dropout方法一起使用。
Trick Normalization 归一化 1. 归一化手段
2. Min-max 与 Zero-mean 区别
对于输出结果范围有要求, 使用Min-max normalization
数据较为稳定, 不存在极端最大值,最小值, 用归一化
如果数据存在异常值或较多噪音, 使用标准化。
3. 为何归一化为何如此优秀? 归一化的本质就是线性变换 。 线性变化的诸多良好性质,决定了为什么对数据进行改变后不会造成“失效”,还能提高数据的表现。
归一化加快了梯度下降求最优解的速度。
假定一个预测房价的例子,两个特征: 面积与房间数,那么则有: , 表房间数, 表面积 , 现实中,面积范围往往在 , 而房间通常为 , 那么面积对模型的影响要更大一些,此时寻求最优解的过程为:
归一化后,寻求最优解的过程为:
在未归一化的时候, 由于 的更新幅度要比 小, 因此 的应该要比 要大,但是在实际中,我们使用常规梯度下降法时,我们各个的学习率都是一样的,这也就造成了 的更新会比较慢,结果就是寻求最优解的过程会走很多弯路导致模型收敛速度缓慢。
我们来实际举例, 假设在未归一化的时候, 我们的损失函数为:
那么经过归一化后,我们的损失函数可能就变为:
很明显可以看到,数据归一化后, 最优解的寻找过程会很平缓,更容易正确收敛到最优解。
其次,还有一些博客中提到,归一化有可能提高精度 , 这在涉及到一些距离计算的算法时效果显著。
Batch Normalization 假设一个 batch 为 m 个输入 , BN 在这 m 个数据之间做 Normalization, 并学习参数 :
Layer Normalization LN 不同于 BN, 其在层内进行 Normalization, 即直接对隐层单元的输出做 Normalization。最大的好处是不再依赖 batch size。
Weight Normalization QA 1. 什么是 ICS? ICS 指的是在训练过程中由于网络参数的变化而导致各层网络的输入分布发生了变化, 而深层网络通过层层叠加,高层的输入分布变化会非常剧烈,这就需要高层不断去重新适应底层的参数更新。而为了训好模型,我们需要非常谨慎的去设定学习率, 初始化权重等。
从数学角度来看,它指的是源空间与目标空间的条件概率是一致的,但是其边缘概率不同。 即对所有 , 但是 。
其实,通俗理解来说,就是对于神经网络的各层输出,由于经过了一系列的隐层操作,其分布显然与各层对应的输入数据分布不同,且这种差距会随着网络深度的增加而加大。而在训练过程中, 网络参数的变化会使得各层网络的输入分布发生变化,越深的网络,变化可能越大。
2. ICS 会导致什么问题?
上层参数需要不断适应新的输入数据分布,降低学习速度
下层输入的变化可能趋向于变大或变小,导致上层落入饱和区,使得学习过早停止。
每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
3. BN 到底解决了什么问题?
解释1: 原论文说 BN 解决了 ICS 问题,但后续有论文推翻了这个结论,参见:《How Does Batch Normalization Help Optimization》
解释2: 为了防止梯度消失,这也很好理解, BN 将激活函数的输入数据压缩在 N(0,1) 空间内,的确能够很大程度上减轻梯度消失问题。
解释3: 来源于《How Does Batch Normalization Help Optimization》 , BN 使得优化空间更加平滑,具体来说,BN实际上是改变了损失函数的 lipschitz 性质, 使得梯度的改变变得很轻微,这使得我们可以采用更大的步长且仍然能够保持对实际梯度方向的精确估计。
通俗来讲, 不进行BN, 损失函数不仅仅非凸且趋向于坑洼,平坦区域和极小值,这使得优化算法极不稳定,使得模型对学习率的选择和初始化方式极为敏感,而BN大大减少了这几种情况发生。
我个人更倾向于第三种解释。
4. BN 的优点与缺点
BN 的优点:
加速网络训练(缓解梯度消失,支持更大的学习率)
抑制过拟合
降低了参数初始化 的要求。
BN 的缺点:
对 batch size的要求较高 。这是因为如果 batch size 过小,无法估计出全局的样本分布
**训练和预测时有些差别。**训练时一个 batch 之间进行 Normalization, 预测时需要依靠训练时获得的 均值和方差来进行预测。
5. 为何训练时不采用移动平均? 参见: 《Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models》
使用 BN 的目的就是为了保证每批数据的分布稳定,使用全局统计量反而违背了这个初衷;
BN 的作者认为在训练时采用移动平均可能会与梯度优化存在冲突;
6. BN 与 LN 的区别是什么? LN 对层进行 Normalization , BN 对 batch 进行 Normalization。 LN 摆脱了对 batch size 的依赖, 在 NLP 领域,使用极为广泛, 基本不用 BN。
我个人的认为是, BN 是对batch进行操作,然而, 语言的复杂度使得 一个 batch 的数据对于全局的数据分布估计极为不准,这使得 BN 的效果变得很差。
7. 什么时候使用 BN 或 LN?
一般只在深层网络中使用, 比如在深层的 Transformer 中, LN 就起到了很关键的作用。
BN 与 LN 应用在非线性映射前效果更佳。
当你发现你的网络训练速度慢,梯度消失,爆炸等问题时, 不妨考虑加入 BN 或 LN 来试试。
使用 BN 时, 对 batch size 要求较高, 且在训练前需要对数据进行 shuffle。
8. BN 在何处做? BN 可以对第 L 层激活函数输出值 或对第 L层激活函数的输入值 进行 Normalization, 对于两个不同的位置,不少研究已经表明:放在第 L 层激活函数输出值会更好 。
9. 为什么要归一化?
归一化的确可以避免一些不必要的数值问题。
为了程序运行时收敛加快。
统一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
避免神经元饱和。啥意思?就是当神经元的激活在接近 0 或者 1 时会饱和,在这些区域,梯度几乎为 0,这样,在反向传播过程中,局部梯度就会接近 0,这会有效地“杀死”梯度。
保证输出数据中数值小的不被吞食。
Reference [1] Batch Normalization
[2] Layer Normalization
[3] How Does Batch Normalization Help Optimization
[4] Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models
深度学习中 Batch Normalization为什么效果好? - 知乎
深度学习中的Normalization模型
Trick 学习率衰减 为什么要进行学习率衰减? 随着训练的加深,当模型训练到一定程度后,损失将不再减少,这个时候模型的一阶梯度接近于0, 对应的 Hessian 矩阵通常是两种情况:
正定,即所有特征值均为正,此时通常可以得到一个局部极小值,若这个局部极小值接近全局最小则模型已经能得到不错 的性能了,但若差距很大,则模型性能还有待于提升,通常情况下后者在训练初最常见。
特征值有正有负,此时模型很可能陷入了鞍点,若陷入鞍点,模型性能表现就很差。
以上两种情况在训练初期以及中期,此时若仍然以固定的学习率,会使模型陷入左右来回的震荡或者鞍点,无法继续优化。所以,学习率衰减或者增大能帮助模型有效的减少震荡或者逃离鞍点。
学习率衰减策略 参见 500 questions 第14 章
Trick 提前终止
前期对该Trick的重视度不够, 想着,不就是过拟合吗? 我只要保存 验证集 loss 最低点的模型, 你过拟合管我什么事情, 然而, 上了 Bert + 中大规模数据集之后, 我才发现什么叫做噩梦 – 训练时间太 bb 长了吧。
那还能咋地, 你总不能把 epoch 数量设置的太小吧, 10 是比较基本的吧(看数据集),但这样跑也能跑个一天一夜,枯了。 这个时候这个Trick 就很有用了,大大节省模型训练时间。
提前终止指的是当验证集的误差连续 n次递增时停止训练 。 一般情况下, 我会先将n设置为一个较大的数, 跑一个较大的 epoch(如20), 然后根据 loss 曲线来选择合适的 epoch 数量和 n, 接下来就欢快的嘿嘿嘿了。
需要注意的是,提前终止有其他很多策略,上面提到的只是很常用的一种,至于什么时候选择什么样的提前终止策略也是一个经验活, 还好, [1] 中为我们提供了一些参考, 值得一看。 由于本人经验时间优先,没有深入探讨,希望有大佬帮忙解惑。下面我简单提一下[1] 中是如何建议的。
Early Stop, but when? [1] 首先,思考一个问题: 如果我们以验证集loss最小值来作为保存模型的依据,那么这会不会对模型的泛化能力产生影响?我个人认为是不会 ,具体需要看Loss曲线图。一般而言,第一次跑的时候,我往往会设置一个很大的 epoch, 这样能够直观的从Loss曲线上看到很多信息,从而帮助我来选择更佳合适 epoch数量, 我个人一般取开始过拟合之后两个epoch作为epoch的最终数量。
我自己做实验发现,在验证集loss最低点不一定能够获得在测试集上最好的效果,有时候,最低点附近的一些点反而在测试集上表现更佳,但差别不大,这也是我认为不会影响模型泛化能力的一个依据, 而实际落地中,这点差别其实真的没有啥鸟用。
回到Trick, 文章谈到, 何时提前停止是对训练时间和泛化误差之间的权衡, 而如果我采用在验证集loss最低点存储模型的方式,那么何时提前停止就不再是对泛化误差的权衡了, 其变成了,如何选择何种的策略来对训练时间 以及获取验证集loss全局最低点 来做权衡,使得我们能够找到该点并保存模型,而不至于陷入一些困境[2]。
最后谈谈 Early Stop 策略, 选择合适的策略能够使得我们在合适的时间终止整个训练,从而节省时间。
Trick 正则化 https://blog.csdn.net/jinping_shi/article/details/52433975
https://zhuanlan.zhihu.com/p/38709373
https://blog.csdn.net/heyongluoyao8/article/details/49429629
1. L1 正则化 - 稀疏正则化 1-范数: 表示向量元素的绝对值之和。
正 则 化 项 : 目 标 函 数 : 梯 度 :
不同于L2,L1 正则化使得权重值可能被减少到0。 因此,L1对于压缩模型很有用。
稀疏向量通常会有许多维度,如果再加上使用特征组合会导致包含更多的维度的。由于使用此类高维度特征向量,因此模型可能会非常庞大,并且需要大量的 RAM。
在高维度稀疏矢量中,最好尽可能使权重正好降至 0。正好为 0 的权重基本上会使相应特征从模型中移除。 将特征设为 0 可节省 RAM 空间,且可以减少模型中的噪点。
2. L2 正则化 – 权重衰减 2-范数: 表示向量元素绝对值的平方和再开方。
正 则 化 项 : 目 标 函 数 : 梯 度 : 梯 度 更 新 :
L2正则化又称权重衰减。因为其导致权重趋向于0 (但不全是0)。
执行 L2 正则化对模型具有以下影响:
使权重值接近于 0(但并非正好为 0)
使权重的平均值接近于 0,且呈正态分布。
QA 1. 为何只对权重进行正则惩罚,而不针对偏置 在神经网络中,参数包括每一层仿射变换的权重 和偏置 ,我们通常只对权重做惩罚而不对偏置做正则惩罚。
精确拟合偏置所需的数据通常比拟合权重少得多。每个权重会指定两个变量如何相互作用。我们需要在各种条件下观察这两个变量才能良好地拟合权重。而每个偏置仅控制一个单变量。这意味着,我们不对其进行正则化也不会导致太大的方差。另外,正则化偏置参数可能会导致明显的欠拟合。
2. 权重衰减的目的 限制模型的学习能力,通过限制参数 θ 的规模(主要是权重 w 的规模,偏置 b 不参与惩罚),使模型偏好于权值较小的目标函数,防止过拟合。
3. L1 与 L2 的异同
4.为什么 L1 正则化 可以产生稀疏值,而 L2 不会? 添加 L1 正则化,相当于在 L1范数的约束下求目标函数 J 的最小值,下图展示了二维的情况:
图中 J 与 L 首次相交的点就是最优解。L1 在和每个坐标轴相交的地方都会有“角”出现(多维的情况下,这些角会更多),在角的位置就会产生稀疏的解。而 J 与这些“角”相交的机会远大于其他点,因此 L1 正则化会产生稀疏的权值。
对于 L2 正则化来说,其二维平面下的图形为:
如上图所示, 相比于 L1 正则化, L2 不会产生 “角”, 因此 J 与 L2 相交的点具有稀疏性的概率就会变得非常小。
5. 为何 L1 和 L2 正则化可以防止过拟合? L1 & L2 正则化会使模型偏好于更小的权值。
简单来说,更小的权值意味着更低的模型复杂度,也就是对训练数据的拟合刚刚好,不会过分拟合训练数据(比如异常点,噪声),以提高模型的泛化能力。
此外,添加正则化相当于为模型添加了某种限制,规定了参数的分布,从而降低了模型的复杂度。模型的复杂度降低,意味着模型对于噪声与异常点的抗干扰性的能力增强,从而提高模型的泛化能力。 – 奥卡姆剃刀原理
主动学习 思路:通过机器学习的方法获取到那些比较难分类的样本数据,让人工再次确认和审核,然后将人工标注得到的数据再次使用有监督学习模型或半监督学习模型进行训练,逐步提升模型效果,将人工姜妍融入机器学习的模型中。
主动学习的流程:
机器学习模型:包括机器学习模型的训练和预测两部分;
https://zhuanlan.zhihu.com/p/301117945
卷积神经网络 CNN 卷积神经网络 – CNN 最擅长的就是图片的处理。它受到人类视觉神经系统的启发。
CNN 有2大特点:
能够有效的将大数据量的图片降维成小数据量
能够有效的保留图片特征,符合图片处理的原则
目前 CNN 已经得到了广泛的应用,比如:人脸识别、自动驾驶、美图秀秀、安防等很多领域。
CNN 解决了什么问题? 在 CNN 出现之前,图像对于人工智能来说是一个难题,有2个原因:
图像需要处理的数据量太大,导致成本很高,效率很低 图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高
需要处理的数据量太大 图像是由像素构成的,每个像素又是由颜色构成的
现在随随便便一张图片都是 1000×1000 像素以上的, 每个像素都有RGB 3个参数来表示颜色信息。
假如我们处理一张 1000×1000 像素的图片,我们就需要处理3百万个参数!
1000×1000×3=3,000,000
这么大量的数据处理起来是非常消耗资源的,而且这只是一张不算太大的图片!
卷积神经网络 – CNN 解决的第一个问题就是「将复杂问题简化」,把大量参数降维成少量参数,再做处理。
更重要的是:我们在大部分场景下,降维并不会影响结果。比如1000像素的图片缩小成200像素,并不影响肉眼认出来图片中是一只猫还是一只狗,机器也是如此。
保留图像特征 图片数字化的传统方式我们简化一下,就类似下图的过程:
假如有圆形是1,没有圆形是0,那么圆形的位置不同就会产生完全不同的数据表达。但是从视觉的角度来看,图像的内容(本质)并没有发生变化,只是位置发生了变化。
所以当我们移动图像中的物体,用传统的方式的得出来的参数会差异很大!这是不符合图像处理的要求的。
而 CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。
那么卷积神经网络是如何实现的呢?在我们了解 CNN 原理之前,先来看看人类的视觉原理是什么?
人类视觉原理 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。下面是人脑进行人脸识别的一个示例:
对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的:
我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。
那么我们可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?
答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。
典型的 CNN 由3个部分构成:
卷积层 – 主要作用是保留图片的特征
池化层 – 主要作用是把数据降维,可以有效的避免过拟合
全连接层 – 根据不同任务输出我们想要的结果
卷积层负责提取图像中的局部特征; 池化层用来大幅降低参数量级(降维); 全连接层类似传统神经网络的部分,用来输出想要的结果
卷积层 卷积——提取特征 卷积层的运算过程如下图,用一个卷积核扫完整张图片:
这个过程我们可以理解为我们使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。
在具体应用中,往往有多个卷积核,可以认为,每个卷积核代表了一种图像模式,如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。如果我们设计了6个卷积核,可以理解:我们认为这个图像上有6种底层纹理模式,也就是我们用6中基础模式就能描绘出一副图像。以下就是25种不同的卷积核的示例:
总结:卷积层的通过卷积核的过滤提取出图片中局部的特征,跟上面提到的人类视觉的特征提取类似。
1. 数学原理 卷积操作原理上其实是对两个矩阵进行点乘求和 的数学操作,其中一个矩阵为输入的数据矩阵 ,另一个矩阵则为卷积核 (滤波器或特征矩阵),求得的结果表示为原始图像中提取的特定局部特征。
2. 卷积的作用 在图像领域中,深层卷积已经证明比浅层卷积更具表征,从图像的特征提取来看, 不同卷积操作提取到的特征类型是不相同的:
卷积层次
特征类型
浅层卷积
边缘特征
中层卷积
局部特征
深层卷积
全局特征
3. 一些常见的卷积核 在传统图像领域,已经证明一些特殊的卷积核能够执行边缘检测,锐化,模糊等操作, 如下表所示:
卷积作用
卷积核
卷积后图像
输出原图
边缘检测(突出边缘差异)
边缘检测(突出中间值)
图像锐化
方块模糊
高斯模糊
4. 卷积核的参数
参数名
作用
常见设置
Kernel Size
卷积核的大小
在过去常设为5,如LeNet-5;现在多设为3,通过堆叠 的卷积核来达到更大的感受域
Stride
卷积步长
常见设置为1,表示滑窗距离为1,可以覆盖所有相邻位置特征的组合;当设置为更大值时相当于对特征组合降采样
Padding
填充策略
SAME: 表示对不足卷积核大小的边界位置进行某种填充(通常零填充)以保证卷积输出维度与与输入维度一致;VALID时则对不足卷积尺寸的部分进行舍弃,输出维度就无法保证与输入维度一致
In Channels
卷积核的深度
默认与输入的特征矩阵通道数(深度)一致;在某些压缩模型中会采用通道分离的卷积方式
Out Channels
卷积核的个数
若设置为与输入通道数一样的大小,可以保持输入输出维度的一致性;若采用比输入通道数更小的值,则可以减少整体网络的参数量
5. 几种常见的卷积方式 https://zhuanlan.zhihu.com/p/28186857
6. 从 pytorch 看一维卷积,二维卷积,三维卷积 参数说明 卷积操作常用的有一维卷积,二维卷积与三维卷积,其中,三维卷积用到就比较少了, 三个类在 Pytorch 中的参数都是一样的,只是输入输出维度有所差别罢了。
1 2 3 4 5 6 7 8 9 in_channels: 输入数据的通道数 out_channels: 卷积操作产生的输出通道数 kernels: 卷积核的大小, int 或 tuple, 卷积核的大小设置是需要反复实验测试的。 stride: 卷积步伐,stride 太小,会导致重复计算较多,计算量大; 而太大,有可能会造成特征遗漏。 padding: 输入数据的每一条边填充0的层数, int 或 tuple, 默认为0 padding_mode: 填充方式, zeros: 以0为填充数据 dilation: 卷积核中元素之间的间距, 默认为 1 groups: 从输入通道到输出通道的阻塞连接数, 默认为1 bias: 是否添加 bias, 默认为True
一维卷积 1 2 3 4 5 6 7 8 9 class torch.nn.Conv1d: -- 输入输出数据: Input: [N, C_in, L_in]: [batch_size, in_channels, input_len] Output: [N, C_out, L_out]: [batch_size, out_channels, output_len] -- 参数: 权重参数: [out_channels, in_channels/groups, kernel_size], 默认初始化为均匀分布 Bias参数: [out_channels], 默认初始化为均匀分布
一维卷积在NLP中常用于 Embedding 部分来提取特征,如在TextCNN中就有使用, 此时可以将词向量维度理解为通道数C_in, 输入序列的长度为 L_in。
注意一点的是,在一维卷积中,卷积核的大小是一维的, 即如 果指定为 n, 则卷积核的大小为 [n, 1, 1]。
二维卷积
单通道:若输入卷积核尺寸为 ,卷积核在输入图像的空间维度上进行滑窗操作,每次滑窗和 窗口内的值进行卷积操作,得到输出图像中的一个值。
多通道:输入图像特征通道数为3,卷积核尺寸为 ,每次滑窗与3个通道上的 窗口内的所有值进行卷积操作,得到输出图像中的一个值。
1 2 3 4 5 6 7 8 9 class torch.nn.Conv2d: -- 输入输出数据: Input: [N, C_in, H_in, L_in]: [batch_size, in_channels, input_len] Output: [N, C_out, H_out, L_out]: [batch_size, out_channels, output_len] -- 参数: 权重参数: [out_channels, in_channels/groups, kernel_size], 默认初始化为均匀分布 Bias参数: [out_channels], 默认初始化为均匀分布
三维卷积
7. 卷积核的选择 大卷积核虽然可以获取更大的感受域,但是大卷积核反而会导致计算量大幅增加,不利于训练更深层的模型,相应的计算能力也会降低。
堆叠2个 3×3 卷积核(二通道)可以获得与 5×5卷积核 相同的感受视野,同时参数量会更少(3×3×2+1<5×5×1+1),这也是 3×3卷积 应用更广泛的原因,在大多数情况下通过堆叠较小的卷积核比直接采用单个更大的卷积核会更加有效。
激活层 激活层本质就是采用激活函数对卷积出的特征做一个非线性变换。
首选 Relu, 然后试试 Relu 变体 Leaky Relu 和 Maxout。
某些情况下 tanh 也能获得不错结果。
池化层(下采样) 数据降维,避免过拟合 池化层简单说就是下采样,他可以大大降低数据的维度。其过程如下:
上图中,我们可以看到,原始图片是20×20的,我们对其进行下采样,采样窗口为10×10,最终将其下采样成为一个2×2大小的特征图。
之所以这么做的原因,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行下采样。
总结:池化层相比卷积层可以更有效的降低数据维度,这么做不但可以大大减少运算量,还可以有效的避免过拟合。
数学原理 池化层的作用 是对感受域内的特征进行筛选,提取区域内最具代表性的特征,能够有效地降低特征尺度,进而减少模型所需要的参数量,此外还可以防止过拟合现象。
池化操作的本质是降采样 。其除了能显著降低参数数量外,还能保持对平移,伸缩,旋转操作的不变性。
无论max pooling还是mean pooling,都没有需要学习的参数。因此,在卷积神经网络 的训练中,Pooling层需要做的仅仅是将误差层 传递到上一层,而没有梯度的计算。
对于max Pooling,下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项都是0。
对于 mean Pooling, 下一层的误差项会均匀划分到该层的所有的神经元上。
卷积层与池化层比较
卷积层
池化层
结构
零填充时输出维度不变,而通道数改变
通常特征维度会降低,通道数不变
稳定性
输入特征发生细微改变时,输出结果会改变
感受域内的细微变化不影响输出结果
作用
感受域内提取局部关联特征
感受域内提取泛化特征,降低维度
参数量
与卷积核尺寸、卷积核个数相关
不引入额外参数
全连接层 — 输出结果 这个部分就是最后一步了,经过卷积层和池化层处理过的数据输入到全连接层,得到最终想要的结果。
经过卷积层和池化层降维过的数据,全连接层才能”跑得动”,不然数据量太大,计算成本高,效率低下。
典型的 CNN 并非只是上面提到的3层结构,而是多层结构,例如 LeNet-5 的结构就如下图所示:
卷积层 – 池化层- 卷积层 – 池化层 – 卷积层 – 全连接层
在了解了 CNN 的基本原理后,我们重点说一下 CNN 的实际应用有哪些。
NLP 与 CV 中使用 CNN 的区别
NLP
CV
卷积核
多为一维卷积, 通常都是由较为浅层的卷积层组成
对二维信号做卷积,一般设为叠加的3×3卷积核
Pooling
一般采用 Max-Pooling
全连接层
一般常采用LN + dropout
一般常采用BN + dropout
CNN 的实际应用
图片分类、检索
目标定位检测
目标分割
人脸识别
骨骼识别
QA 1. 为什么需要 Padding ? 图像是 5 × 5的矩阵,我们的卷积核是 3 × 3的,最终我们得出的feature map是 3 × 3 的矩阵(n -f + 1) 。
这样会带来两个问题:
如果加上 paddding 之后,我们的 feature-map 就变为 (n + 2p - f + 1) × (n + 2p - f + 1)的矩阵。
Padding存在的意义在于:
2. 为什么卷积核设计尺寸都是奇数
保证像素点中心位置,避免位置信息偏移
填充边缘时能保证两边都能填充,原矩阵依然对称
3. 卷积操作的特点
**稀疏交互:**卷积神经网络中,卷积核尺度远小于输入的尺度,这样每个输出神经网仅与前一层区域内的神经元存在连接权重,我们称此为稀疏交互。
提高了模型的统计效率:原本一幅图像只能提供少量特征,现在每一块像素区域都可以提供一部分特征
使得参数大量减少,优化的时间复杂度也会减小几个数量级,过拟合情况也得到改善。
稀疏交互的意义在于,先从局部的特征入手,再将局部特征组合起来形成更复杂和抽象的特征 。
参数共享: 参数共享指的是同一个模型的不同模块中使用相同的参数 。参数共享的意义在于使得卷积层具有平移等特性 。
权重共享一定程度上能增强参数之间的联系,获得更好的共性特征 。
很大程度上降低了网络的参数,节省计算量和计算所需内存 。
权重共享能起到很好正则的作用 。正则化的目的是为了降低模型复杂度,防止过拟合,而权重共享则正好降低了模型的参数和复杂度。
平移不变性: (局部)平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现 而不关心它出现的具体位置时。平移不变性是由于参数共享 和池化 所带来的。
4. 你觉得 CNN 有什么不足?
信息损失问题。 CNN在Pooling的时候会丢失大量的有价值信息,以及忽略局部与整体之间的关联性比如得分最高的特征只出现了一次,而得分第二高的特征出现了很多次,得分第二高的特征可能比最高的特征还要重要,却被丢弃了,自然造成了不小的信息损失
忽略了位置信息 :一个区域有用的特征极有可能和另一个区域的信息有联系,如TextCNN:对于一些粒度较粗的分类问题如话题分类,位置信息可能不大,但对于如情感分析这种粒度较细的分类问题,位置信息不足便会导致一些问题,如”虽然他长的很帅,但是人品不好”和”虽然他人品不好,但他长得帅啊”,在情感倾向上区别还是比较明显的。
5. CNN 与 RNN 的优劣
并行能力, 训练时间很漫长
RNN 容易发生梯度消失 ,包括 LSTM
CNN 的感受视野受限于卷积核,需要深层的 CNN 网络来获得更大的感受视野
6. 卷积,池化的意义
卷积和池化可能导致欠拟合
如果一项任务涉及到要对输入中相隔较远的信息进行合并 时,那么卷积可能就不正确了。
如果一项任务依赖于保存精确的空间信息 ,那么在所有的特征上使用池化将会增大训练误差。
当我们比较卷积模型的统计学习表现时,只能以基准中的其他卷积模型作为比较的对象
7. 卷积中不同零填充的影响 假定 m, k 分别代表图像的宽度和卷积核的宽度:
Valid 卷积(有效卷积) :不使用零填充,卷积核只允许访问那些图像中能够完全包含整个核 的位置,输出的宽度为 m − k + 1
在这种情况下,输出的所有像素都是输入中相同数量像素的函数,这使得输出像素的表示更加规范。
然而,输出的大小在每一层都会缩减,这限制了网络中能够包含的卷积层的层数。(一般情况下,影响不大,除非是上百层的网络)
Same 卷积(相同卷积):只进行足够的零填充来 保持输出和输入具有相同的大小 ,即输出的宽度为 m.
在这种情况下,只要硬件支持,网络就能包含任意多的卷积层。
然而,输入像素中靠近边界的部分相比于中间部分对于输出像素的影响更小。这可能会导致边界像素存在一定程度的欠表示。
**Full 卷积(全卷积):**进行足够多的零填充使得每个像素都能被访问 k 次(非全卷积只有中间的像素能被访问 k 次),最终输出图像的宽度为 m + k − 1
因为 same 卷积可能导致边界像素欠表示,从而出现了 Full 卷积;
但是在这种情况下,输出像素中靠近边界的部分相比于中间部分是更少像素的函数。这将导致学得的卷积核不能再所有所有位置表现一致 。
事实上,很少使用 Full 卷积
通常零填充的最优数量 处于 “有效卷积”和 “相同卷积” 之间。
8. 1 * 1 卷积的作用? https://zhuanlan.zhihu.com/p/40050371
实现信息的跨通道交互和整合。
对卷积核通道数进行降维和升维,减小参数量。
9. 卷积核是否越大越好? 卷积核越大,参数量越多。 前期无法使用较小卷积核是因为,前期的模型无法做的很深,这样限制了卷积核的感受视野。但其实,通过堆叠2 个 3 * 3 卷积核可以获得与 5 * 5 卷积核相同的感受视野,同时参数量特更少。 因此,大多数情况下,通过堆叠较小的卷积核比直接采用单个较大的卷积核更加有效。
自然语言中, TextCNN 就采用单层的卷积核,此时选择合适的,较大的卷积核相对比较重要, 而DPCNN 中,因为能够将卷积做的很深,那么就可以采用3 * 3 的卷积核来做了。
10. 如何减少卷积层参数量?
用深层小卷积代替浅层大卷积
使用分离卷积操作:将原本 的卷积操作分离为 和 的两部分操作
添加 卷积
在卷积层前使用池化操作
11. CNN 特点
区域不变性: filter 在每层的输入向量(图像)上滑动,检测的是局部信息,然后通过pooling取最大值或均值。pooling这步综合了局部特征,失去了每个特征的位置信息。
这很适合基于图像的任务,比如要判断一幅图里有没有猫这种生物,你可能不会去关心这只猫出现在图像的哪个区域。但是在NLP里,词语在句子或是段落里出现的位置,顺序,都是很重要的信息。
局部组合性: CNN中,每个滤波器都把较低层的局部特征组合生成较高层的更全局化的特征。
这在CV里很好理解,像素组合成边缘,边缘生成形状,最后把各种形状组合起来得到复杂的物体表达。在语言里,当然也有类似的组合关系,但是远不如图像来的直接。而且在图像里,相邻像素必须是相关的,相邻的词语却未必相关。
12. 为何较大的batch size 能够提高 CNN 的泛化能力? 在相同迭代次数和学习率的条件下,每批次采用更多的数据将有助于模型更好的学习到正确的模式,模型输出结果也会更加稳定
13. SAME 与 VALID 的区别
SAME: 宽卷积,通常采用零填充的方式对卷积核不满足整除条件的输入特征进行补全,以使卷积层的输出维度保持与输入特征维度一致。
VALID:窄卷积,不进行任何填充,在输入特征边缘位置若不足以进行卷积操作,则对边缘信息进行舍弃,因此在步长为1的情况下该填充方式的卷积层输出特征维度可能会略小于输入特征的维度。
14. CNN 优缺点 优点:
共享卷积核,优化计算量。
无需手动选取特征,训练好权重,即得特征。
深层次的网络抽取图像信息丰富,表达效果好。
保持了层级网络结构。
不同层次有不同形式与功能。
缺点:
需要调参,需要大样本量,GPU等硬件依赖。
物理含义不明确。
基本单元 MLP
1. 万能近似定理 一个前馈神经网络如果具有至少一个非线性输出层,那么只要给予网络足够数量的隐藏单元,它就可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的函数。
万能近似定理 表明一个单层的网络就足以表达任意函数,但是该层的维数可能非常大,且几乎没有泛化能力;此时,使用更深的模型能够减少所需的单元数,同时增强泛化能力(减少泛化误差)。参数数量相同的情况下,浅层网络比深层网络更容易过拟合。
2.在深度神经网络中,非线性单元,放弃了训练问题的凸性,其意义何在? 放弃训练问题的凸性,简单来说,就是放弃寻求问题的最优解。
非线性单元 的加入,使训练问题不再是一个凸优化 问题。这意味着神经网络很难得到最优解,即使一个只有两层和三个节点的简单神经网络,其训练优化问题仍然是 NP-hard 问题 (Blum & Rivest, 1993).
但即使如此,使用神经网络也是利大于弊的:
人类设计者只需要寻找正确的函数族 即可,而不需要去寻找精确的函数。
使用简单的梯度下降优化方法就可以高效地找到足够好的局部最小值
增强了模型的学习/拟合能力,如原书中所说“ maxout 单元可以以任意精度近似任何凸函数”。至于放弃凸性后的优化问题可以在结合工程实践来不断改进。 “似乎传统的优化理论结果是残酷的,但我们可以通过工程方法 和数学技巧 来尽量规避这些问题,例如启发式方法、增加更多的机器和使用新的硬件(如GPU)。”
3. 如何解决非线性问题
手动去设计一个非线性转换
核方法:其实内部本质也是非线性变换
神经网络:依据激活函数来提供非线性
循环神经网络 RNN 卷积神经网络 – CNN 和普通的算法大部分都是输入和输出的一一对应,也就是一个输入得到一个输出。不同的输入之间是没有联系的
但是在某些场景中,一个输入就不够了!
为了填好下面的空,取前面任何一个词都不合适,我们不但需要知道前面所有的词,还需要知道词之间的顺序。
这种需要处理「序列数据 – 一串相互依赖的数据流」的场景就需要使用 RNN 来解决了。
典型的集中序列数据:
文章里的文字内容
语音里的音频内容
股票市场中的价格走势
……
RNN 之所以能够有效的处理序列数据,主要是基于他的比较特殊的运行原理。下面给大家介绍一下 RNN 的基本运行原理。
原理 传统神经网络的结构比较简单:输入层 – 隐藏层 – 输出层。如下图所示:
RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。如下图所示:
下面用一个具体的案例来看看 RNN 是如何工作的:
假如需要判断用户的说话意图(问天气、问时间、设置闹钟…),用户说了一句“what time is it?”我们需要先对这句话进行分词:
然后按照顺序输入 RNN ,我们先将 “what”作为 RNN 的输入,得到输出「01」
然后,我们按照顺序,将“time”输入到 RNN 网络,得到输出「02」。
这个过程我们可以看到,输入 “time” 的时候,前面 “what” 的输出也产生了影响(隐藏层中有一半是黑色的)。
以此类推,前面所有的输入都对未来的输出产生了影响,大家可以看到圆形隐藏层中包含了前面所有的颜色。如下图所示:
当我们判断意图的时候,只需要最后一层的输出「05」,如下图所示:
RNN 的缺点也比较明显
通过上面的例子,我们已经发现,短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域),这就是 RNN 存在的短期记忆问题。
RNN 有短期记忆问题,无法处理很长的输入序列
训练 RNN 需要投入极大的成本
由于 RNN 的短期记忆问题,后来又出现了基于 RNN 的优化算法,下面给大家简单介绍一下。
RNN 的优化算法 LSTM RNN 是一种死板的逻辑,越晚的输入影响越大,越早的输入影响越小,且无法改变这个逻辑。
LSTM 做的最大的改变就是打破了这个死板的逻辑,而改用了一套灵活了逻辑——只保留重要的信息。
简单说就是:抓重点!
举个例子,我们先快速的阅读下面这段话:
当我们快速阅读完之后,可能只会记住下面几个重点:
LSTM 类似上面的划重点,**他可以保留较长序列数据中的「重要信息」,忽略不重要的信息。**这样就解决了 RNN 短期记忆的问题。
从 LSTM 到 GRU Gated Recurrent Unit – GRU 是 LSTM 的一个变体。他保留了 LSTM 划重点,遗忘不重要信息的特点,在long-term 传播的时候也不会被丢失。
GRU 主要是在 LSTM 的模型上做了一些简化和调整,在训练数据集比较大的情况下可以节省很多时间。
RNN 的应用和使用场景 只要涉及到序列数据的处理问题,都可以使用到,NLP 就是一个典型的应用场景。
文本生成: 类似上面的填空题,给出前后文,然后预测空格中的词是什么。
机器翻译: 翻译工作也是典型的序列问题,词的顺序直接影响了翻译的结果。
语音识别: 根据输入音频判断对应的文字是什么。
生成图像描述: 类似看图说话,给一张图,能够描述出图片中的内容。这个往往是 RNN 和 CNN 的结合。
视频标记: 他将视频分解为图片,然后用图像描述来描述图片内容。
总结 RNN的独特价值在于:它能有效的处理序列数据。比如:文章内容、语音音频、股票价格走势…
之所以他能处理序列数据,是因为在序列中前面的输入也会影响到后面的输出,相当于有了“记忆功能”。但是 RNN 存在严重的短期记忆问题,长期的数据影响很小(哪怕他是重要的信息)。
于是基于 RNN 出现了 LSTM 和 GRU 等变种算法。这些变种算法主要有几个特点:
长期信息可以有效的保留
挑选重要信息保留,不重要的信息会选择“遗忘”
RNN 几个典型的应用如下:
文本生成
语音识别
机器翻译
生成图像描述
视频标记
基础相关
QA 1. RNN 中为何会出现梯度消失,梯度爆炸问题 RNN 的梯度消失问题
因此, RNN 的梯度消失,梯度爆炸问题在于:
2. Relu 能否作为RNN的激活函数 答案是可以,但会产生一些问题:
换成 Relu 可能使得输出值变得特别大,从而产生溢出
换成Relu 也不能解决梯度消失,梯度爆炸问题,因为还有 连乘的存在(如1中公式)
为什么 CNN 和前馈神经网络采用Relu 就能解决梯度消失,梯度爆炸问题?
因为CNN 或 FNN 中各层的 W 并不相同, 且初始化时是独立同分布的,一定程度熵可以抵消。
而 RNN 中各层矩阵 是一样的。
3. 推导 LSTM 关键在于三个门, 三个状态。 其中三个门的公式基本一样
输入门:决定当前时刻输入 有多少保存到当前时刻 :
输出门:控制当前时刻的 有多少信息作为当前时刻的 :
当前输入的状态 : 将上一时刻的 与当前时刻的 融合:
当前时刻的状态 : 将 , , 融合:
当前时刻的输出 :从 中分出一部分信息:
4. LSTM 长短记忆机制 长短记忆机制主要通过 输入门 与 遗忘门 来实现:
如果当前信息 不重要, 则输入门 相应维度接近于 0, 当前的信息就几乎不融入进入 。反之, 输入门相应维度接近于 1, 当前信息实现很好的融入。
如果之前的信息 不重要,则遗忘门相应维度接近于 0, 过去的信息就几乎不融入进 。 反之,亦然。
5. LSTM的门机制为何选择 sigmoid 作为激活函数? 值得一提的是, 目前几乎所有主流的门控机制中,门控单元的选择均使用 sigmoid 。
sigmoid 的饱和性: 十分符合 门控 的效果
值域在 (0,1), 当输入较大或较小时,输出会接近1 或 0, 从而保证门的开或关。
6. 融合信息时为何选择 tanh?
值域为 (-1, 1), 这样会带来两个好处:
与大多数情景下特征分布以 0 为中心相吻合。(激活函数一章中有提到这点特性的重要性)
可以避免前向传播时的数值溢出问题(主要是上溢)
tanh 在 0 附近有较大的梯度,模型收敛更快
7. 计算资源有限的情况下有没有什么优化方法?
8. 推导一下 GRU 两个门,两个状态
更新门:控制前一时刻状态信息与当前输入融合
重置门:控制前一时刻状态信息
当前输入的信息融入 :
当前时刻的状态:
9. LSTM 与 GRU 之间的关系
GRU 认为遗忘门 与输入门 功能有一定的的重合,认为之前的信息 与 当前的输入信息是此消彼长的关系,因此将二者合并成一个门: 更新门。
合并了记忆状态 c 与隐藏状态 h
采用重置门 代替了输出门
10 为何RNN 会有梯度消失现象,推一下? RNN 的梯度消失问题
11. LSTM 与 GRU 区别
LSTM 中的单元状态 c 与 GRU 中的 h 类似,但 GRU 去掉了 h 这个状态,即最后的输出不再进行调节,那么也就不需要输出门了
在产生新的全局状态时, LSTM 采用 输入门+遗忘门 的方式, 而 GRU 只采用更新门来控制
更新门起到了遗忘门的作用, 重置门起到了输入门的作用。
12. 为何 RNN 训练时 loss 波动很大 由于RNN特有的memory会影响后期其他的RNN的特点,梯度时大时小,learning rate没法个性化的调整,导致RNN在train的过程中,Loss会震荡起伏。
为了解决RNN的这个问题,在训练的时候,可以设置临界值,当梯度大于某个临界值,直接截断,用这个临界值作为梯度的大小,防止大幅震荡。
13. LSTM 中的激活函数选择 LSTM, 门的激活函数选择 Sigmoid, 而在生成 c 时采用 tanh。
Sigmoid函数的输出在0~1之间,符合门控的物理定义。且当输入较大或较小时,其输出会非常接近1或0,从而保证该门开或关。
在生成候选记忆时,使用Tanh函数,是因为其输出在−1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度,通常使模型收敛更快。
长短期记忆网络 LSTM 原理 长短期记忆网络——通常被称为 (Long-Short Term Memory,LSTM),是一种特殊的 RNN,能够学习长期依赖性。由 Hochreiter 和 Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。LSTM 在各种各样的问题上表现非常出色,现在被广泛使用。
LSTM 被明确设计用来避免长期依赖性问题。长时间记住信息实际上是 LSTM 的默认行为,而不是需要努力学习的东西!
所有递归神经网络都具有神经网络的链式重复模块。在标准的 RNN 中,这个重复模块具有非常简单的结构,例如只有单个 tanh 层。
LSTM 也具有这种类似的链式结构,但重复模块具有不同的结构。不是一个单独的神经网络层,而是四个,并且以非常特殊的方式进行交互。
不要担心细节。稍后我们将逐步浏览 LSTM 的图解。现在,让我们试着去熟悉我们将使用的符号。
在上面的图中,每行包含一个完整的向量,从一个节点的输出到其他节点的输入。粉色圆圈表示逐点运算,如向量加法;而黄色框表示学习的神经网络层。行合并表示串联,而分支表示其内容正在被复制,并且副本将转到不同的位置。
核心思路 LSTM 的关键是细胞状态,即图中上方的水平线。
细胞状态有点像传送带。它贯穿整个链条,只有一些次要的线性交互作用。信息很容易以不变的方式流过。
LSTM 可以通过所谓“门”的精细结构向细胞状态添加或移除信息。
门可以选择性地以让信息通过。它们由 S 形神经网络层和逐点乘法运算组成。
S 形网络的输出值介于 0 和 1 之间,表示有多大比例的信息通过。0 值表示“没有信息通过”,1 值表示“所有信息通过”。
一个 LSTM 有三种这样的门用来保持和控制细胞状态。
基础理论 AUC计算 基础理论 Softmax 1. Softmax 定义
2. Softmax 损失
QA 1. 为何一般选择 softmax 为多分类的输出层 虽然能够将输出范围概率限制在 [0,1]之间的方法有很多,但 Softmax 的好处在于, 它使得输出两极化:正样本的结果趋近于 1, 负样本的结果趋近于 0。 可以说, Softmax 是 logistic 的一种泛化。
基础理论 偏差 vs 方差,欠拟合 vs 过拟合 参考: 偏差与方差, 欠拟合与过拟合
定义
理解概念
偏差: 表示模型在训练集上的表现,与训练误差 成线性关系, 用于描述模型的拟合能力
方差: 表示模型在(开发集或测试集)与测试误差-训练误差 成线性关系,用于描述模型的泛化能力。
四种情况
偏差很低,方差很高: 意味着训练误差很低,测试误差很高,此时发生了过拟合现象。
偏差很高,方差很低: 意味着训练误差,测试误差都很高,此时发生了欠拟合现在。
偏差,方差都很高: 意味着此时同时发生了欠拟合和过拟合现象。
偏差很低,方差很低: 意味着训练误差很低,测试误差也很低,表示我们的模型训练的结果很好。
偏差与欠拟合,方差与过拟合
偏差通常是由于我们定义的模型不合适或模型复杂度不够,所造成的现象为欠拟合。
方差主要是由于模型复杂度过高造成的, 所造成的现象是过拟合。
如何降低偏差(欠拟合)
加大模型规模(更换其余机器学习算法,神经网络可以增加每层神经元/神经网络层数):
偏差很高很有可能是因为模型的拟合能力差,对于传统机器学习算法,各个方法的拟合能力不同,选择一个拟合能力更好的算法往往能够得出很好的结果。 对于神经网络(拟合能力最强)而言,通过增加网络层数或增加每层单元数就能够很好的提高模型的拟合能力[3][4][5]。
根据误差分析结果来修改特征:
我们需要将错误样本分类,判断可能是由于什么原因导致样本失败,在针对分析结果,增加或减少一些特征。
减少或去除正则化: 这可以避免偏差,但会增大方差。
修改模型结构,以适应你的问题:对于不同的问题,不同的模型结构会产生更好的结果,比如在CV中常用CNN,而在NLP领域常用LSTM。
如何降低方差(过拟合)
重新分析,清洗数据。
有时候,造成方差很大的原因往往是由于数据不良造成的,对于深度学习来说,有一个大规模,高质量的数据集是极为重要的。
添加更多的训练数据。
增大训练数据能够往往能够提高模型的泛化能力。可以采用数据增强技术。
加入正则化。
加入提前终止。
意思就是在训练误差变化很慢甚至不变的时候可以停止训练,这项技术可以降低方差,但有可能增大了偏差。 提前终止有助于我们能够在到达最佳拟合附近,避免进入过拟合状态。
通过特征选择减少输入特征的数量和种类。
显著减少特征数量能够提高模型的泛化能力,但模型的拟合能力会降低,这意味着,该技术可以减小方差,但可能会增大偏差。 不过在深度学习中,我们往往直接将所有特征放入神经网络中,交给算法来选择取舍。
减少模型规模,降低模型复杂度(每层神经元个数/神经网络层数): 谨慎使用。
一般情况下,对于复杂问题如CV或NLP等问题不会降低模型复杂度,而对于简单问题,采用简单模型往往训练速度更快,效果很好。
根据误差分析结果修改输入特征。
修改模型架构,使之更适合你的问题。 一般可以选择简单模型的情况下,不选择复杂模型。
集成学习。
基础理论 分类问题评估指标 几个定义:混淆矩阵
TP: True Positives, 表示实际为正例 且被分类器判定为正例 的样本数
FP: False Positives, 表示实际为负例 且被分类器判定为正例 的样本数
FN: False Negatives, 表示实际为正例 但被分类器判定为负例 的样本数
TN: True Negatives, 表示实际为负例 且被分类器判定为负例 的样本数
一个小技巧, 第一个字母表示划分正确与否, T 表示判定正确(判定正确), F表示判定错误(False); 第二个字母表示分类器判定结果, P表示判定为正例, N表示判定为负例。
几个常规的指标 Accuracy:
正 确 预 测 的 样 本 数 所 有 的 样 本 数
Accuracy 能够清晰的判断我们模型的表现,但有一个严重的缺陷: 在正负样本不均衡的情况下,占比大的类别往往会成为影响 Accuracy 的最主要因素,此时的 Accuracy 并不能很好的反映模型的整体情况。
Precision:
预 测 为 且 预 测 正 确 的 样 本 个 数 预 测 为 样 本 个 数
Recall:
预 测 为 且 预 测 正 确 的 样 本 个 数 真 实 样 本 中 所 有 为 的 样 本 个 数
Precision 与 Recall 的权衡
精确率高,意味着分类器要尽量在 “更有把握” 的情况下才将样本预测为正样本, 这意味着精确率能够很好的体现模型对于负样本的区分能力,精确率越高,则模型对负样本区分能力越强。
召回率高,意味着分类器尽可能将有可能为正样本的样本预测为正样本,这意味着召回率能够很好的体现模型对于正样本的区分能力,召回率越高,则模型对正样本的区分能力越强。
从上面的分析可以看出,精确率与召回率是此消彼长的关系, 如果分类器只把可能性大的样本预测为正样本,那么会漏掉很多可能性相对不大但依旧满足的正样本,从而导致召回率降低。
F1 Score F1-Score 能够很好的评估模型,其主要用于二分类问题, 计算如下:
而 更一般的有 :
其实, 本质上是Recall, Precision 权重比, 当 时, 表明 Recall 的权重要比Precision高,其影响更大, ; 当 时, 表明 Recall 的权重要比Precision低, 对应的影响更小;
前面提到 F1 针对的是二分类,而更一般的是,对于多分类问题来说, F1 的计算有多种方式,可以参见 Scikit-Learn 中的评价指标,我们来分别介绍一下。
对于一个多分类问题,假设,对于分类 而言有: , 那么各种 F1 的值计算如下。
Macro F1 : 宏平均
Macro 算法在计算 Precision 与 Recall 时是先分别计算每个类别的Precision 与 Recall, 然后再进行平均。
那么我们就得到最终的 Macro F1 的计算为:
我们看到, Macro F1 本质上是所有类别的统计指标的算术平均值来求得的,这样单纯的平均忽略了样本之间分布可能存在极大不平衡的情况
Micro F1 :微平均
Micro 算法在计算 Precision 与 Recall 时会将所有类直接放到一起来计算。
Macro vs Micro [1]
Macro 相对 Micro 而言,小类别起到的作用更大,举个例子而言,对于一个四分类问题有:
class A: 1 TP, 1 FP
class B: 10 TP , 90 FP
class C: 1 TP, 1 FP
class D: 1 TP, 1 FP
那么对于 Precision 的计算有:
我们看到,对于 Macro 来说, 小类别相当程度上拉高了 Precision 的值,而实际上, 并没有那么多样本被正确分类,考虑到实际的环境中,真实样本分布和训练样本分布相同的情况下,这种指标明显是有问题的, 小类别起到的作用太大,以至于大样本的分类情况不佳。 而对于 Micro 来说,其考虑到了这种样本不均衡的问题, 因此在这种情况下相对较佳。
总的来说, 如果你的类别比较均衡,则随便; 如果你认为大样本的类别应该占据更重要的位置, 使用Micro; 如果你认为小样本也应该占据重要的位置,则使用 Macro; 如果 Micro << Macro , 则意味着在大样本类别中出现了严重的分类错误; 如果 Macro << Micro , 则意味着小样本类别中出现了严重的分类错误。
为了解决 Macro 无法衡量样本均衡问题,一个很好的方法是求加权的 Macro, 因此 Weighed F1 出现了。
Weight F1
Weighted 算法算术 Macro 算法的改良版,是为了解决Macro中没有考虑样本不均衡的原因, 在计算 Precision与Recall 时候,各个类别的 Precision 与 Recall要乘以该类在总样本中的占比来求和:
那么我们就得到最终的 Macro F1 的计算为:
MCC :马修斯相关系数 MCC 主要用于衡量二分类问题,其综合考虑了 TP TN, FP , FN, 是一个比较均衡的指标, 对于样本不均衡情况下也可以使用。MCC的取值范围在 [-1, 1] , 取值为1 表示预测与实际完全一致, 取值为0表示预测的结果还不如随机预测的结果, -1 表示预测结果与实际的结果完全不一致。因此我们看到, MCC 本质上描述了预测结果与实际结果之间的相关系数。
值得注意的是,对于两个分类器而言,可能其中一个分类器的 F1 值较高,而其 MCC 值较低, 这表示单一的指标是无法衡量分类器的所有优点与缺点的。
ROC 曲线 在分类任务中,测试部分通常是获得一个概率表示当前样本属于正例的概率, 我们往往会采取一个阈值,大于该阈值的为正例, 小于该阈值的为负例。 如果我们减小这个阈值, 那么会有更多的样本被识别为正类,这会提高正类的识别率,但同时会降低负类的识别率。
为了形象的描述上述的这种变化, 引入ROC曲线来评价一个分类器的好坏。 ROC 曲线主要关注两个指标:
横 坐 标 纵 坐 标
其中, FPR 代表将负例错分为正例的概率, TPR 表示能将正例分对的概率, 如果我们增大阈值, 则 TPR 会增加,而对应的FPR也会增大, 而绘制ROC曲线能够帮助我们找到二者的均衡点,下图很清晰的描述了ROC 曲线关系:
在 ROC 曲线中, 有:
FPR = 0, TPR = 0: 表示将每一个实例都预测为负类
FPR = 1, TPR = 1:表示将每一个实例都预测为正例
FPR = 0, TPR = 1:为最优分类点
分类器对应的ROC曲线应该尽可能靠近坐标轴的左上角, 而对角线的位置意味着分类器的效果和随机猜测一样的差。
**ROC曲线在测试集中的样本分布发生变化的时候能够保持不变。**但遗憾的是,很多时候, ROC 曲线并不能清晰的说明哪个分类器的效果更好, 而 AUC 恰恰能够对分类器做出直观的评价。
AUC:Area under Curve AUC 为ROC 曲线下的面积, 这个面积的数值介于0到1之间, 能够直观的评价出分类器的好坏, AUC的值越大, 分类器效果越好。
AUC = 1: 完美分类器, 采用该模型,不管设定什么阈值都能得出完美预测(绝大多数时候不存在)
0.5 < AUC < 1: 优于随机猜测,分类器好好设定阈值的话,有预测价值
AUC = 0.5: 跟随机猜测一样,模型没有预测价值
AUC < 0.5 :比随机猜测还差,但是如果反着预测,就优于随机猜测。
值得一提的是,两个模型的AUC 相等并不代表模型的效果相同, 比如这样:
实际场景中, AUC 的确是非常常用的一种指标。
需要注意的是, 在多分类场景下的 ROC 曲线以及 AUC 值, 此时 ROC 曲线应该有多个, 而AUC 的计算如下:
表 示 类 别 数 量
P-R 曲线 P-R 曲线其横坐标为 Recall, 纵坐标为 Precision, 其能帮助我们很好的做出权衡
在上图中,我们发现, A 完全包住了C, 着意味着A 的Precision 与 Recall 都高于C, A优于C。 而对比 A,B, 二者存在交叉的情况,此时采用曲线下面积大小衡量性能,面积越大,性能越好,此处的A优于B。
最后 对于最终分类指标的选择, 在不同数据集,不同场景,不同时间下都会有不同的选择,但往往最好选出一个指标来做优化,对于二分类问题,我目前用 AUC 比较多一些, 多分类我还是看 F1 值。
Reference [1] Should I make decisions based on micro-averaged or macro-averaged evaluation measures?
[2] Micro Average vs Macro average Performance in a Multiclass classification setting >
[3 机器学习性能评估指标
QA 1. 训练集中类别不平衡,哪个参数最不准确? Accuracy
基础理论 指数加权平均 指数加权平均本质上是一种近似求取平均值的方法。
我们也以吴恩达课上的例子举例, 假设
表示从第0天到第 天的平均温度值。
表示第 t 点的温度值。
我们具体展开来说, 假设时间 ,加权参数 , 那么则有:
我们将上式带入化简有:
观察上式我们发现, 指数加权平均实质上就是以指数式加权递减的移动平均。 各数值的加权而随时间而指数式递减,越近期的数据加权越重,但较旧的数据也给予一定的加权。
但有一点需要注意的是, 我们观察上式,在最后一项中它的系数为 , 这个数已经很接近于0了, 这就意味着,在 时刻对加权平均值所起到的作用微乎其微, 继而引出一个问题: 我们加权平均所得到的值到底平均了多少天?
答案是 天。这是因为当 时, 有 , 当 时, 有 , 也就是说当权重下降到 (或者说 ) 以下时就被忽略不计了。
前面说到指数平均的本质依旧是计算平均值 ,那么在深度学习中为什么不使用我们常用的平均值求法,而要搞得这么复杂呢? 答案是效率以及内存问题。
在深度学习中,数据量经常是非常庞大的, 如果我们使用传统方法来计算平均值,无论是从内存还是从计算量上, 对计算机的压力是很大的, 而对比对数加权平均方法, 我们每次只需要保存上一时刻的值,无论是内存开销还是计算量都小的可怜。
偏差修正 当我们还有指数加权平均来计算平均值时, 一开始的指数加权平均值会很小, 不能代表平均值, 所以需要使用偏差修正:
但是一般机器学习并不关心一开始的指数加权平均值,所以可以不用偏差修正来修正。
基础理论 数据角度看深度学习 数据集定义
训练集: 训练集用来训练你的模型,来确定模型的参数而非超参数,这些参数往往称为学习参数, 如权重参数W, 偏置参数b。
**验证集:**交叉验证集用于验证模型的performance,从而对模型进行超参数调整以及确定最终模型,这些超参数包括:学习率,网络结构等 。有时也称为交叉验证集。
**测试集:**测试集用于对算法进行评估,不会改变学习算法和参数。
数据集划分 划分原则
验证集的规模应该尽可能大,至少能够区分出你所尝试的不同算法之间的性能差异。一般来说,验证集的规模应该在 1000 - 10000 之间。
测试集的规模应该大到使你能够对模型的性能进行一个高度可信的评估即可。当数据规模一般时(100-10000)时,采用数据的10%-30%来作为测试集;在数据规模很大时(10w级别),采用1%作为1%甚至更小。总的来说,只要能够很好的评估模型性能即可。
验证集与测试集的规模并不是越大越好,但如果数据丰富,可以适当选择较大的验证集与测试集。
划分建议
在样本量有限的情况下,有时候会把验证集和测试集合并。实际中,若划分为三类,那么训练集:验证集:测试集=6:2:2;若是两类,则训练集:验证集=7:3。
在海量样本的情况下,这种情况在目前深度学习中会比较常见。此时由于数据量巨大,我们不需要将过多的数据用于验证和测试集。例如拥有1百万样本时,我们按训练集:验证集:测试集=98:1:1的比例划分,1%的验证和1%的测试集都已经拥有了1万个样本,这已足够验证模型性能了。
数据时分布
训练集的分布不需要与实际数据分布一致,而应该更多的考虑如何均衡样本分布。
验证集与测试集应该服从同一分布,且该分布能够很好的反应实际数据的分布。二者分布相同有助于定位问题:
训练集分布于验证集,测试集分布没必要一致。训练集更多的考虑模型的performance,而测试集与验证集是与真实数据相关的,更多考虑的是泛化能力。
数据不匹配问题 1 如何定位数据不匹配? 数据不匹配问题是个不容易定位和解决的问题。这个问题出现总会和模型过拟合表现很相似,即在训练集上能体现非常不错的性能,但在测试集上表现总是差强人意但区别在于如果遇到是数据不匹配的问题,通常在用一批和训 练集有看相同或者相似分布的数据上仍然能取得不错的结果。但很多时候,当测试集上结果表现很差时,很多初学 者可能会直接将问题定位在模型过拟合上,最后对模型尝试各种方法后,性能却始终不能得到有效提升。当遇到这 种情况时,建议先定位出是否存在数据不匹配的问题。最简单的验证方式就是可以从训练集中挑选出一部分数据作 为验证集,重新划分后训练和验证模型表现。
2 举例常见几个数据不匹配的场景? 例如设计款识别物体的app时,实际场景的图片均来自于手机拍摄,而训练集确是来自于网上各类抓取下来的图 片。例如在图像去噪、去模糊、去雾、超分辨率等图像处理场景时,由于大量数据的难以获取,因此都会采用人为 假设合成的图像进行训练,这时候应用到实际场景中也容易出现不匹配的问题
3 如何解决数据不匹配问题? 数据不匹配是个很难有固定方法来解决的问题。这里提供几条供参考的途径: 1、收集更多符合实际场最需要的数据。这似乎是最简单但也最难方式 2、对结果做错误分析。找出数据集中出错的数据和正确数据之间的特点和区别,这对你无论是进行后续模型的分析或者是数据的处理提供非常有效的思路。注意,这里的数据集包括训练集和测试集 3、数据集增强。数据集增强并不意味看数据集越大越好,其目的是丰富数据的分布以适应更多的变化当遇到数 据不匹配时,对数据处理般可以有两种方式。其一,合成或处理更多接近需要的数据特点。其二,对所有数据包 括实际场景数据都进行处理,将所有数据都统一到另一个分布上,统一出一种新的特点。
4 如何提高深度学习系统的性能 当我们要试图提高深度学习系统的性能时,目前我们大致可以从三方面考虑:
1、提高模型的结构,比如增加神经网络的层数,或者将简单的神经元单位换成复杂的 LSTM 神经元,比如在自然语言处理领域内,利用 LSTM 模型挖掘语法分析的优势。
2、改进模型的初始化方式,保证早期梯度具有某些有益的性质,或者具备大量的稀疏性,或者利用线性代数原理的优势。
3、选择更强大的学习算法,比如对度梯度更新的方式,也可以是采用除以先前梯度 L2 范数来更新所有参数,甚至还可以选用计算代价较大的二阶算法。
QA 1. 数据为何要 shuffle ? shuffle 的意思是洗牌或弄乱,即打乱数据集中样本的排列顺序。这样带来一个直接的好处就是样本的分布变得均匀了。
在优化中有一个原则是:网络从意料之外的样本中学习最快,所以说,如果为了加速学习,我们要求每次喂入的数据和前一份数据相关性较低。
总的来说,shuffle的意义在于加速模型学习。
基础理论 梯度消失,梯度爆炸问题 1. 梯度消失,梯度爆炸产生原因 请看我的这篇文章: RNN 的梯度消失问题 , 讲的已经很清楚了。
总的来说,梯度消失,梯度爆炸问题本质上是由于随着深度的加深,受到权重信息,激活函数的影响,连乘机制所引发的一系列问题。
2. 解决方案 解决梯度消失,梯度爆炸问题,最终的目的是解决如何在深层网络上的优化问题,当然深层网络所带来的问题远不止梯度消失,爆炸问题。
1. 采用 Relu 系激活函数 参考:激活函数
2. 合适的权重初始化 参考:权重初始化
3. 残差结构 残差的方式,能使得深层的网络梯度通过跳级连接路径直接返回到浅层部分,使得网络无论多深都能将梯度进行有效的回传。
4. Batch Normalization, Layer Normalization 参考:Normalization
5. LSTM 参考:RNN 的梯度消失问题 , 讲的很清楚了。
6. 梯度裁剪 - 梯度爆炸 如果梯度超过某个阈值,就对其进行限制。
基础理论 目标函数,损失函数,代价函数 经验风险与结构风险
经验风险指的是模型对数据的拟合程度,拟合程度越高,经验风险越小。(其实对应的就是代价函数)
结构风险指的是对模型复杂度的评估,模型越复杂,结构风险越大。(其实对应的就是目标函数)
只考虑将经验风险最小化,会出现过拟合现象。
损失函数,代价函数,目标函数 其实在很多论文和博客中都用的很随意,其实三者之间是有着细微的区别的:
损失函数(Loss Function):一般针对单个样本的描述。其用来衡量模型预测值与真实值不一致的程度,是一个非负实值函数,通常使用 表示。 损失函数越小,模型的鲁棒性就越好。
代价函数(Cost Function):一般是针对总体。我们需要通过训练代价函数来获得最优参数,最常见的如平方差代价函数:
目标函数(Object Function):等价于 代价函数 + 正则化项 , 其往往也是我们模型中要优化求解的函数 – 目标函数。
常用的损失函数 1 . 0-1 损失函数
相等为 0 , 不相等为1。一般的在实际使用中,相等的条件过于严格,可适当放宽条件:
2. 绝对值损失函数
3. 平方损失函数
4. 对数损失函数
常见的逻辑回归使用的就是对数损失函数。逻辑回归它假设样本服从伯努利分布(0-1分布),进而求得满足该分布的似然函数,接着取对数求极值等 。
5. 指数损失函数 指数损失函数的标准形式为:
例如AdaBoost就是以指数损失函数为损失函数。
6. Hinge损失函数
其中 是预测值,范围为 , 为目标值,其为 或 。
在线性支持向量机 中,最优化问题可等价于
上式相似于下式
其中 是Hinge损失函数, 可看做为正则化项。
常用的代价函数 二次代价函数适合输出神经元是线性的情况,交叉熵代价函数适合输出神经元是S型函数的情况。
1. 二次代价函数 单 样 本 : 单 样 本 :
2. 交叉熵代价函数 ,
它是⾮负的, J > 0。可以看出:式子中的求和中的所有独⽴的项都是负数的,因为对数函数的定义域是 (0,1),并且求和前⾯有⼀个负号,所以结果是非负。
如果对于所有的训练输⼊ x,神经元实际的输出接近⽬标值,那么交叉熵将接近 0。
3. 对数似然函数代价函数 交叉熵一般与 sigmoid 结合,而对数似然代价函数一般与 softmax 结合。 对数似然代价函数在二分类时可以化简为交叉熵代价函数的形式。
QA 1. Sigmoid 为何与交叉熵搭配二不用二次方代价函数 如果使用二次方代价函数,根据权值 和 的偏导:
考虑到 sigmoid 函数倒数在输出接近 0 和 1 时非常小, 会导致一些样本在刚开始训练时学习的非常慢。
2. sigmoid 为何要与交叉熵搭配 交叉熵函数权值 和偏置 的梯度推导为:
,
由以上公式可知,权重学习的速度受到 影响,更大的误差,就有更快的学习速度,避免了二次代价函数方程中因 导致的学习缓慢的情况。
3. Logistic 回归为何要使用对数损失函数? 逻辑回归它假设样本服从伯努利分布(0-1分布) ,进而求得满足该分布的似然函数,接着取对数求极值等。整个过程如下:
将对数似然函数与上文提到的对数损失函数对比,发现,二者的本质是相同的,所以Logistic 直接采用对数损失函数。
4.为什么交叉熵损失相比均方误差损失能提高以 sigmoid 和 softmax 作为激活函数的层的性能? 简单来说,就是使用均方误差(MSE)作为损失函数时,会导致大部分情况下梯度偏小 ,其结果就是权重的更新很慢,且容易造成“梯度消失”现象。而交叉熵损失克服了这个缺点,当误差大的时候,权重更新就快,当误差小的时候,权重的更新才慢。
推导过程: https://blog.csdn.net/guoyunfei20/article/details/78247263
5. 损失函数有哪些? 怎么用?
平方损失 – 预测问题
交叉熵 – 分类问题
Hinge 损失 – SVM
CART 回归树的残差损失
Reference [1] DeepLearning-500-questions
基础理论 维数灾难问题 引言 先思考一个问题: 数据的维度越高越好吗? 恐怕不是吧,不然为什么机器学习中特征工程如此的重要,简单来说, 当数据维度过高时,会为学习带来一些困难。
其实,任何的机器学习算法,其性能与特征数量的关系往往是这样的:
1. 维度再难会带来哪些问题?
数据稀疏: 这很好理解, 因为维数增多,样本密度必然减少, 举例而言:假设我们现在有10个样本, 而每一维的宽度为5个单位, 这样样本密度为 ; 那么在二维空间下, 样本密度为: , 我们看到样本密度成倍数减少,最终造成了数据稀疏。
**样本分布不均匀:**准确的来说,处于中心位置的训练样本比边缘训练样本更加稀疏。
这点可以通过数学定理来解释:N个点在p维单位球内随机分布,则随着p的增大,这些点会越来越远离单位球的中心,转而往外缘分散。而各点距单位球中心距离的计算公式为:
从另一个角度来看,对于D维空间,位于半径 和半径 之间的部分占球总体积的百分比是多少?
答案是,随着D的增加,这个比率接近为1 , 这也就解释了为什么在高维空间中,球体的大部分体积都聚集在表面附近的薄球壳上。
外 环 外 内 环 外
**过拟合问题:**可以肯定的一点是,样本在高维数据上更容易分类,但是,在高维中训练得到的分类器其实相当于低维空间上的一个复杂非线性分类器,而了解过拟合的同学都应该知道, 模型过于复杂往往是造成过拟合的直接原因。
2. 如何解决维数灾难问题?
对于数据稀疏与分布不均的问题,只有通过增加训练样本和降维的方式来解决。
对于过拟合问题,可以添加针对过拟合的一些操作来解决。
基础理论 距离度量方法 1. 欧式距离 衡量点之间的直线距离
二 维 : 维 :
2. 曼哈顿距离 二 维 : 维 :
3. 余弦距离 将两个点看做是空间中的两个向量,通过衡量两向量之间的相似性来衡量样本之间的相似性。
二 维 : 或 维 :
4. 切比雪夫距离 各对应坐标数值差的最大值。
二 维 : 维 :
QA 1. 余弦相似度 与 欧式距离的区别与联系
区别:
欧式距离和余弦相似度都能度量2个向量之间的相似度,但是欧式距离从2点之间的距离去考量,余弦相似从2个向量之间的夹角去考量。举例如下:
假设 2人对三部电影的评分分别是 A = [3, 3, 3] 和 B = [5, 5, 5]
那么2人的欧式距离是 根号12 = 3.46, A、B的余弦相似度是1(方向完全一致)。
从上例可以发出,2人对三部电影的评价趋势是一致的,但是欧式距离并不能反映出这一点,余弦相似则能够很好地反应。余弦相似可以很好地规避指标刻度的差异,最常见的应用是计算 文本的相似度 。
联系:
归一化后计算的欧式距离是关于余弦相似的单调函数 ,可以认为归一化后,余弦相似与欧式距离效果是一致的(欧式距离越小等价于余弦相似度越大)。
因此可以将 求余弦相似转为求欧式距离 ,余弦相似的计算复杂度过高,转为求欧式距离后,可以借助KDTree(KNN算法用到)或者BallTree(对高维向量友好)来降低复杂度。
基础理论 迁移学习 基础理论 局部最小值,鞍点 基础原理 神经网络最终收敛何处?
QA
1. 如何避免陷入局部最小值与鞍点?
SGD 或 Mini-batch:SGD 与 Mini-batch 引入了随机性,每次以部分样本来计算梯度,能够相当程度上避免陷入局部最小值。
动量: 引入动量,相当于引入惯性。一些常见情况时,如上次梯度过大,导致进入局部最小点时,下一次更新能很容易借助上次的大梯度跳出局部最小点。
自适应学习率:通过学习率来控制梯度是一个很棒的思想, 自适应学习率算法能够基于历史的累计梯度去计算一个当前较优的学习率。
多任务学习 浅谈多任务学习(Multi-task Learning): https://zhuanlan.zhihu.com/p/348873723
Refernence An Overview of Multi-Task Learning in Deep Neural Networks
对比学习 Reference 对比学习(Contrastive Learning)综述
对比学习(Contrastive Learning)相关进展梳理
损失函数 Focal loss
深度学习模型压缩 综述 https://zhuanlan.zhihu.com/p/67871864
https://zhuanlan.zhihu.com/p/36051603
https://blog.csdn.net/wspba/article/details/75671573
自监督学习 https://zhuanlan.zhihu.com/p/110278826
https://zhuanlan.zhihu.com/p/125721565
调参 优化算法 优化算法在深度学习中也是十分重要的,虽然一般情况下无脑 Adam 即可,但有时采用其余的优化算法反而能够获得更好的结果,这点很有意思。同时,理解优化算法的原理对于选择和面试还是很有帮助的。
超参数设置 – 遵循原论文
优化算法
超参数
SGD
Momentum
Adagrad
RMSprop/ Adadelta
Adam
Adamax
Nadam
三大基本算法 1. 随机梯度下降 为 学 习 率
2. 标准梯度下降
3. mini-batch 梯度下降
三者比较
随机梯度下降: 每次更新的方向并不向全局最优解的方向前进,最终的收敛结果也往往在全局最优解附近,但并不能达到最优解。迭代过程不可测。不容易陷入局部最小值。
标准梯度下降: 更新速度很慢,每次都要计算全部样本的梯度。且由于梯度方向过于稳定一致(没有随机因素)且更新次数过少,很容易陷入鞍点或局部最小值。
mini-batch 梯度下降: 二者折中,batch size 的设置是一个艺术。
梯度下降算法的一点改进 1. 动量梯度下降法 在使用梯度下降算法中,很容易产生一种“震荡现象”(相邻前后梯度正负相反),这种震荡现象减慢了梯度下降法的速度,这也导致你无法使用更大的学习率, 如果你使用较大的学习率, 可能导致震荡更大, 收敛更慢。
**Momentum的核心思想: 通过计算梯度的指数加权平均值,并利用该平均值来更新你的权重,这样梯度的变化就没有那么快了。**其本质是通过增加动量来减少随机,增加梯度的稳定性。
加 权 系 数 , 常 取 值 为
举个例子, 假如这里有个碗状的峡谷, 峡谷中坑坑洼洼,有许多小坡, 如果我们从峡谷上推下一个球, 根据物理现象,由于加速度,小球的速度在下降的过程中越来越快, 即使路上遇到小坡,也能够轻松跨越(跨不过去,就是局部最小点了), 直至到达谷底。
引申到动量法的参数变化中: 对于在梯度点处具有相同的方向的维度,表明加速度为正,那么速度自然加快;对于在梯度点处改变方向的维度, 加速度为负, 速度减缓。 这样,我们可以得到更快的收敛速度, 同时可以减少摇摆。
2. Nesterov Accelerated Gradient
思想: 在动量法中, 小球总是以一种盲目的方式滚动, 这会造成一个问题, 在临近最优点的附近时控制不住速度,于是会造成我们在最优点附近摇啊摇,最终收敛。
我们希望小球足够聪明,它能够预判后面的地形, 如果后面是下坡路就加速下降, 如果后面是上坡路,说明我们已经到了最优点附近, 该减速了。
实现方式:Nesterov就利用这一思想,它将 假定为下一位置, 通过计算它的梯度,就可以得到我们接下来是加速还是刹车了,的确很聪明。
优点:Nesterov Accelerated Gradient 相比Momentum, 能显著的提升了优化效果,收敛速度要快很多。
我们来从数学角度分析一下, 相对 momentum, 到底发生了什么变化:
具体推论需要再次参考 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目
自适应学习率优化算法 0. 为何要自适应学习率? 在梯度下降的过程中,每个参数更新的频率与幅度是不同的,到了训练中后期,对于某些变量,也许已经到达了极小值附近,而有些变量仍然在初始位置不远处。 此时,如果我们采用不同的学习率会导致一个问题: 如果学习率偏小,则那些更新不多的参数会收敛的很慢,如果学习率偏大,那么对于处于极小值附近的参数,很容易产生不稳定现象。
为了解决这个问题,我们需要针对不同的参数设置不同的学习率, 但参数是无穷尽的, 不可能去人为的设置每一个参数的学习率,因此,自适应学习率就显得很有必要了。
1. Adagrad 是 一 个 极 小 值 , 防 止 分 母 为 , 一 般 设 置 为
是一个对角矩阵, 上的元素表示在第 t 步更新时, 历史上 梯度的积累。
**思想:**对每个参数用不同的学习率,这个学习率在一开始比较大,用于快速梯度下降。随着优化过程的进行,对于已经下降很多的参数,则减缓学习率,对于还没怎么下降的参数,则保持一个较大的学习率。
方法: 通过维护一个对角矩阵来累积历史梯度来实现学习率的变化, 其中对角线上的每个元素表示某个参数历史梯度的累积。
如果某参数历史梯度较大,那么说明该参数优化的快,更有可能到达最优点附近, 而此时它在对角矩阵上对应的累积梯度也大, 从而使得对应的学习率较小,最终实现不同参数有着不同的学习率。
优点: 十分适合处理稀疏数据。消除了需要手动调整学习率的问题。
缺陷: 分母项的积累: 由于每个附加项都是正数,因此累积总和在训练期间不断增长。这反过来导致学习速率缩小并最终变得无限小,此时算法不再进行优化。
2. Adadelta
表示 t 时刻的**平方梯度对数平均值**, 本质的思想用了对数平均的思路。
改进: 改进 Adagrad 中学习率最终无限小的问题。
思想: 通过设定一个窗口大小 w , 来求最近 w 个平方梯度的对数平均值(对数平均的思想),采用求平均值而非求和的方式可以有效的避免学习率无限低问题。
3. RMSprop
比较 RMSprop 与 Adadelta 二者公式可以发现,在 Adadelta 取 就是RMSprop了。
4. Adam
是**历史梯度**的**对数平均估计**, 是**历史梯度平方**的**对数平均估计**,其实就是求取的 的近似。
是对 的校正,可以近似为对 的无偏估计。
我们结合 Momentum 与 RMSProp 算法来看, Adam算法本质上就是将二者结合,同时考虑到梯度与梯度平方, 通过历史梯度来加速收敛, 通过历史梯度平方来修正学习率。
更复杂的分析,推荐: 深度学习最常用的算法:Adam优化算法
5. AdaMax 6. Nadam 如何选择优化算法? 我个人一般选择 Adam, 优点是,收敛快,这样模型迭代起来也快, 如果是轻量级模型的话, 需要好好选择优化算法调参, 而如果是重量级的模型, 无脑 Adam 是一个相当不错的选择。
QA 1. 在mini-batch 中, batch size 会带来怎样的影响? batch size 的大小往往是由多个因素决定的:
较大的批能得到更精确的梯度估计 。
较小的批能带来更好的泛化误差 ,泛化误差通常在批大小为 1 时最好。但是,因为梯度估计的高方差,小批量训练时需要较小的学习率 以保持稳定性,这意味着更长的训练时间 。
batch size 与所需显存息息相关,可参见:GPU 显存不足怎么办?
在 GPU 上, 请采用 2 的幂数作为 batch size, 一般取值在 32 - 256。
小批量更容易利用多核架构 ,但是太小的批并不会减少计算时间,这促使我们使用一些绝对最小批量
2. 深度学习为什么不用二阶优化? 目前深度学习中,反向传播主要是依靠一阶梯度。二阶梯度在理论和实际上都是可以应用都网络中的,但相比于一阶梯度,二阶优化会存在以下一些主要问题:
计算量大,训练非常慢。
二阶方法能够更快地求得更高精度的解,这在浅层模型是有益的。而在神经网络这类深层模型中对参数的精度要求不高,甚至不高的精度对模型还有益处,能够提高模型的泛化能力。
稳定性:二阶方法能更快求高精度的解,同样对数据本身要的精度也会相应的变高,这就会导致稳定性上的问题。
Reference [1] An overview of gradient descent optimization algorithms
路遥知马力——Momentum
比Momentum更快:揭开Nesterov Accelerated Gradient的真面目
调参 权重初始化 前言 本节先对一些常见的初始化方案进行描述,然后依托于 Pytorch , 论述 Pytorch 中提供的几个初始化方案,最后提出一些使用建议。
权重初始化为何如此重要? 虽然 Batch Normalization, Layer Normalization 等 Trick 大大减轻了我们需要精选权重初始化方案的需要,但对于大多数情况下, 选择合适的初始化方案依旧有利于加速我们模型的收敛。
从根本上看,选择合适的初始化方案能够使得我们的损失函数便于优化(有些优化面坑坑洼洼,有些优化面比较光滑); 从另一个角度来说, 合适的权重初始化有利于减轻梯度消失,梯度爆炸问题(参考公式推导)。
Xavier 初始化 , 表 示 第 层 神 经 元 的 个 数
在对梯度的研究中, 发现反向梯度从输出层到输入层逐渐减小, 同时反向梯度的方差随网络反向也逐渐减小,针对这种现象,提出了Xavier initialization。
其的基本思想为:保持每一层输入的方差,反向梯度的方差一致 。通过方差可以控制输入输出分布以及分布密度之间不要相差太大, 这可以使得信息在网络中能够更平滑的传播。
Kaiming 初始化 kaiming初始化的出现是因为xavier存在一个不成立的假设。xavier在推导中假设激活函数都是线性的,而在深度学习中常用的ReLu等都是非线性的激活函数。而kaiming初始化本质上是高斯分布初始化,与上述高斯分布初始化有所不同,其是个满足均值为0,方差为2/n的高斯分布:
初始化方案 1. 常量初始化
1 torch.nn.init.constant_(tensor, val)
2. 随机初始化 如果我们采用随机初始化,因为我们不知道我们的参数会初始化为多少, 如果初始化不合理, 造成梯度消失的可能性是相当之大,另一方面,如果初始化在优化面坑坑洼洼的那一面,我们的优化过程将变得异常曲折,局部最小值,鞍点以及大的平坦区会造成优化的噩梦。
2. 均匀分布初始化 - U(a,b) 1 torch.nn.init.uniform_(tensor, a=0.0, b=1.0)
3. 高斯分布 - N(mean, std) 1 torch.nn.init.normal_(tensor, mean=0.0, std=1.0)
4. 单位矩阵初始化 1 torch.nn.init.eye_(tensor)
5. Xavier 初始化
Xavier 均匀分布
1 torch.nn.init.xavier_uniform_(tensor, gain=1.0)
Xavier 正态分布
1 torch.nn.init.xavier_normal_(tensor, gain=1.0)
6. Kaiming 初始化(MSRA初始化)
Kaiming 均匀分布
1 torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
Kaiming 正态分布
1 torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
7. 正交初始化 1 torch.nn.init.orthogonal_(tensor, gain=1)
8. 稀疏初始化 1 torch.nn.init.sparse_(tensor, sparsity, std=0.01)
QA 1. 推导一下 Xavier 的过程 单层网络 假设我们使用线性激活函数 ,那么对于一层网络来说有:
根据方差展开式有:
那么,当 时, 输出 y 的方差为:
如果 独立同分布, 也独立同分布, 那么有:
那么,我们就可以得出:
于是,为了保证方差的一致性,则应该有:
现在我们延伸到多层网络中,我们假设 是第 层激活函数的输出向量, 是第 层激活函数的输入向量。
前向传播
那么在前向传播中, 第 层的方差可以累积表达为:
反向传播 而在反向传播公式中, 损失函数对于 梯度公式为:
那么在d层网络中,第 层梯度的累计方差为:
我们的目的是,要求各层输入方差一致且各层梯度的方差也一致,这也就意味着:
那么必须有:
前 向 传 播 : 反 向 传 播 :
我们的W需要同时满足以上两个条件, 因此作为折中,有:
如果我们假设 W 服从均匀分布,则W在区间[a,b]内均匀分布的方差为:
那么带入就可以得到W的分布:
适用范围 Reference [1] Xavier Glorot et al., Understanding the Difficult of Training Deep Feedforward Neural Networks
[2] Kaiming He et al., Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classfication
聊一聊深度学习的weight initialization
吴恩达团队:神经网络如何正确初始化?
调参 激活函数 https://zhuanlan.zhihu.com/p/352668984
前言 本文先对激活函数的特性,常见的激活函数以及如何选择合适的激活函数。
**需要注意的是,激活函数是来向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线。**可参考:激活函数,你真的懂了吗?
激活函数的性质
**非线性:**为模型引入非线性因素
**几乎处处可微:**有限的不可微点有左右导数(左右导数可能不同,如Relu)。 便于反向传播,利于优化
**计算简单:**激活函数在神经网络前向的计算次数与神经元的个数成正比,因此简单的非线性函数自然更适合用作激活函数。这也是ReLU之流比其它使用Exp等操作的激活函数更受欢迎的其中一个原因。
**非饱和性:**饱和指的是在某些区间梯度接近于零(即梯度消失),使得参数无法继续更新的问题。
**单调性:**当激活函数是单调的时候,单层网络能够保证是凸函数;
: 当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值。
由于这个条件与非线性有点矛盾,因此激活函数基本只是部分满足这个条件,如 relu 只再 x>0 时为线性。
输出值的范围有限: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;但这导致了前面提到的梯度消失问题,而且强行让每一层的输出限制到固定范围会限制其表达能力。
当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的 Learning Rate。
参数少: 大部分激活函数都是没有参数的。
归一化: 主要思想是使样本分布自动归一化到零均值、单位方差的分布,从而稳定训练。
激活函数一览 1. sigmoid 2. tanh tanh 本质上是 sigmoid 向下平移和伸缩后的结果。
3. Relu 如何选择激活函数
如果是二分类问题, 输出层是sigmoid,其余层是Relu
一般隐层采用Relu, 有时也要试试 tanh, 这两大函数的变体都有必要试试
Relu 的优点
Relu 不耗费资源,且导数为1, 学习起来较快
sigmoid, tanh 的导数在正负饱和区的梯度都会接近于0, 这会造成梯度消失。
Relu 有Dead Relu 问题,此时试试其变体, 如Leaky Relu
激活函数的稀疏激活性 从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。当 时,ReLU 硬饱和,而当 时,则不存在饱和问题。ReLU 能够在 时保持梯度不衰减,从而缓解梯度消失问题。
QA 0. Dead Relu 问题 某些神经元可能永远不会被激活, 导致其相应的参数永远不能被更新。其本质是由于Relu在的小于0时其梯度为0所导致的。
首先我们假设Relu的输入是一个低方差中心在+0.1的正态分布, 此时假设现在大多数Relu的输入是正数,那么大多数输入经过Relu函数能得到一个正值, 因此此时大多数输入能够反向传播通过Relu得到一个梯度, 于是我们的Relu的输入就完成了更新。
假设在随机反向传播中, 有一个巨大的梯度经过了Relu且此时Relu的输入为正(Relu是打开的), 那么该梯度会引起Relu输入X的巨大变化, 假设此时输入X的分布变成了一个中心在-0.1 的正态分布。此时的情况如下:
首先, 大多数Relu的输入变为负数, 输入经过Relu函数就能得到一个0, 这也意味着大多数输入不能反向传播通过Relu得到一个梯度,导致这部分输入无法通过更新。
1. Relu VS Sigmoid VS tanh
sigmoid 缺陷:
极容易导致梯度消失问题
计算费时
sigmoid 函数不是关于原点中心对称的
tanh 缺陷: 无法解决梯度消失问题
Relu 优点:
一定程度上缓解了梯度问题: 其导数始终为一个常数
计算速度非常快: 求导不涉及浮点运算,所以速度更快
减缓过拟合: ReLU 在负半区的输出为 0。一旦神经元的激活值进入负半区,那么该激活值就不会产生梯度/不会被训练,造成了网络的稀疏性——稀疏激活 , 这有助于减少参数的相互依赖,缓解过拟合问题的发生
2. 为什么Relu 不是全程可微也能用于基于梯度的学习? 虽然 ReLU 在 0 点不可导,但是它依然存在左导数和右导数 ,只是它们不相等(相等的话就可导了),于是在实现时通常会返回左导数或右导数的其中一个,而不是报告一个导数不存在的错误。
3. 为何加入非线性因素能够加强网络的表示能力?
神经网络的万能近似定理:神经网络只要具有至少一个非线性隐藏层,那么只要给予网络足够数量的隐藏单元,它就可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间 的函数。
如果不使用非线性激活函数,那么每一层输出都是上层输入的线性组合 ;此时无论网络有多少层,其整体也将是线性的,这会导致失去万能近似的性质
但仅部分层是纯线性 是可以接受的,这有助于减少网络中的参数 。
4. 为何 tanh 比 sigmoid 收敛快?
调参 超参数调优 https://zhuanlan.zhihu.com/p/29247151
超参数一览 1. 超参数是什么?
参数: 需要训练,指的是模型训练中的权重参数和 bias 参数。
超参数: 不需要训练,需要在训练前进行指定,并不断调整。
其实就很多超参数来说,调整的意义并不大,毕竟往往网络的超参数多达几十个,要是都精调的话,那岂不是得 gg, 因此往往是对重要参数精调,对次要参数粗调。
此外,很多 Trick 往往需要一些其他的超参数,对于这部分参数,往往我会遵循原论文,适当的调一调就行。毕竟,Trick 无穷尽呀。
2. 网络结构参数 网络参数指的是你自己构建网络结构时的相关参数,如卷积核数量,网络层数等
CNN 网络参数
超参数
说明
推荐值
kernel size
卷积核的 size
一般为奇数:[7 * 7], [5 * 5], [3 * 3], [1 * 1]
kernel num
卷积核的数量
一般在 [100, 600] 间探索
RNN 网络参数
Transformer 参数
2. 优化参数 优化参数指的是反向传播中所涉及到的参数,主要包括:学习率, batch_size, 对应优化器参数, 损失函数参数等。
超参数
说明
推荐值
learning rate
最重要的参数,需要精调
下文有推荐
batch size
次要重要参数,需要精调
[1: 1024]
dropout
解决过拟合的重要参数,需要精调
[0: 0.5]
优化器相关参数:
正则化参数:
超参
说明
推荐值
L2 权重衰减系数
[0, 1e-4]
3. Trick 参数
几个重要的超参数 1. 学习率 – 最重要的超参数 学习率直接控制着梯度更新时的量级,从而直接影响模型的优化与最终的有效容量。 幸运的是,对于学习率的设置,已经有一套行之可效的指导方案了, 针对不同的优化器,有不同的设置区间。
如果是微调,那么学习率要降低两个数量级左右(参考 Bert 的 adam 学习率)
优化器
设置范围
SGD
[1e-2 ,1e-1]
Momentum
[1e-3, 1e-2]
Adagrad
[1e-3, 1e-2]
Adadelta
[1e-2, 1e-1]
RMSprop
[1e-3, 1e-2]
Adam
[1e-3, 1e-2]
Nadam
[1e-3, 1e-2]
2. batch size 一般情况下, batch size 我往往会以 128 为起点,上下调整,注意,batch size 要设置为 2 的幂次方, 范围在 [1, 1024] 之间。
此外,需要一提的是 Batch Normalization 与 batch size 息息相关,如果你使用了 Batch Normalization, 那么 batch size 就不能设的太小, 这点我在 Normalization 那一节中有详细解释。
3. dropout dropout 我往往会设置先为 0.5, 然后在 [0.0, 0.5] 范围内精调。
Dropout 往往会在卷积层和全连接层之间是有来防止过拟合。 使用 Dropout 需要注意两点:
在RNN中,如果直接放在memory cell中,循环会放大噪声,扰乱学习。一般会建议放在输入和输出层;
不建议dropout后直接跟上batchnorm,dropout很可能影响batchnorm计算统计量,导致方差偏移,这种情况下会使得推理阶段出现模型完全垮掉的极端情况;
4. 优化器参数 对于优化器的一些参数,我往往会采取默认值,这是因为,默认值都是论文最初的设置,一般都能够获得不错的表现,我个人一般不做很精细的调试,也不建议这样去做。
超参数调优策略 采用2的幂次方作为 batch_size 的值,并在对数尺度上对学习率进行采样。
1. 网格搜索
定义一个 n 维的网格,每一格都有一个超参数。
对于每个维度,定义可能的取值范围
搜索所有可能的配置并获得最佳结果
我个人一般还是用 Markdown 表格来做记录, 如下:
优化算法
学习率
batch_size
adam
1e-5
128
**缺点:**该方法痛点真的很痛,那就是:维数灾难 。 随着要精调的超参数的增加,搜索在时间复杂度上也会增加的越多(指数级别),最终使得该策略不可行。
优点: 如果采用较大的搜索范围以及较小步长,该方法有很大概率能找到全局最优值
因此, 我一般尽可能少的去调节次要超参数,比如优化算法默认 Adam 等。此外, 先进行粗调来寻找全局最优值可能的位置,然后采用精调的策略寻找更精确的最优值。
一般只有超参数在 4 个以内才使用网格搜索,不然太费时间了。
2. 随机搜索 随机搜索在搜索范围内随机选取样本点,它认为如果样本点集足够大,那么通过随机采样也能大概率的找到全局最优值或其近似值。
优点: 比网格搜索要快
缺点:结果无法保证,很依靠调参经验。
我一般都是以推荐超参数设置方案来作为第一次的设置,然后围绕这个设置点上下浮动。
3. 贝叶斯优化 网格搜索与随机搜索都是独立于之前的训练的,
https://zhuanlan.zhihu.com/p/29779000
贝叶斯则是利用历史的搜索结果进行优化搜索。其主要有四部分组成,
目标函数,大部分情况下就是模型验证集上的损失。
搜索空间,即各类待搜索的超参数。
优化策略,建立的概率模型和选择超参数的方式。
历史的搜索结果。
首先对搜索空间进行一个先验性的假设猜想,即假设一种选择超参的方式,然后不断的优化更新概率模型,最终的目标是找到验证集上误差最小的一组超参数。
QA 1. 为何学习率那么重要? 当模型训练到一定程度后, 损失将不再减少,这个时候模型的一阶梯度接近于0,此时的Hessian 矩阵通常是两种情况:
正定,即所有特征值均为正,此时通常可以得到一个局部极小值,若这个局部极小值接近全局最小则模型已经能得到不错 的性能了,但若差距很大,则模型性能还有待于提升,通常情况下后者在训练初最常见。
特征值有正有负,此时模型很可能陷入了鞍点,若陷入鞍点,模型性能表现就很差。
2. 卷积核尺寸为何都是奇数?
保证像素点中心位置,避免位置信息偏移
填充边缘时能保证两边都能填充,原矩阵依然对称
3. 深层网络为何难以训练
4. 神经网络为何要做深?
神经元数量相同的情况下,深层网络比浅层网络具有更大容量和表达空间。
隐藏层增加意味着由激活函数带来的非线性变换的嵌套层数更多,就能构造更复杂的映射关系。
5. 调节 batch_size 对训练效果影响如何?
Batch_size 太小,模型表现效果极其糟糕(error )
6. 合理增加 batch size 有何好处?
内存
利用率提高了,大矩阵乘法的并行化效率提高。
跑完一次 epoch 所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
7. 盲目增大 Batch_Size 有何坏处?
内存,显存容量可能撑不住
跑完一次 epoch 所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
迁移学习
Reference 一文看懂自然语言处理中迁移学习的现状